Django外键表格保存



edit:我已经解决了问题(在Stackoverflow和irc的帮助下,我必须等两天才能将这个问题标记为已解决的问题。请参见下面的答复查看解决方案!

我目前正在为我和我的朋友使用一个" IMDB"克隆。这个想法是我们每个人都有一个帐户,可以提交新电影或对已经提交的电影进行投票。这些电影是通过评级来对其进行排序的,用户可以访问详细信息以查看各个评论。

为了实现这一目标,我正在使用Models.py中的外国钥匙 - 一个用于电影条目(带有导演,标题等的信息),一个用于个人投票。后一个使用外国钥匙来获取电影标题和提交评论的用户。

但是,在测试提交评论的表单时,我遇到的"不是null约束失败:list_vote.voter_id_id'错误。浏览错误页面时,我发现exourthkey值未提交到数据库

params: [None, None, 9.0]
query: ('INSERT INTO "list_vote" ("movie_id_id", "voter_id_id", "rating") VALUES (?, ' '?, ?)') 
self  <django.db.backends.sqlite3.base.SQLiteCursorWrapper object at 0x7f77b8907dc8>

然而,当我在'post.save()'命令时浏览局部var的错误页面时,丢失的变量似乎存在

entry: <Entry: Starwars 4>
form: <VoteForm bound=True, valid=True, fields=(rating)>
movie_id: 'Starwars 4'
post: <Vote: Vote object>
request: <WSGIRequest: POST '/vote/starwars-4/'>
slug: 'starwars-4'
voter_id    : <SimpleLazyObject: <User: admin>>

如果我将" Movie_ID"one_answers" user_id"值添加到我的Modelform(在"字段"变量中),则表单实际上可以工作。(尽管这不是我想要的,因为该数据库中可能有数百部电影,因此选择了很难。现在,任何用户都可以假装是任何人)

我可能错过了很明显的东西,但是对于我的一生,我无法弄清楚我在做什么错。模型,表格等基于django_girls教程(它们工作的地方)和" hello webapp"书(尽管本书中未使用外键)

有人知道我在这里做错了吗?

这些是使用的模型:

class Entry(models.Model):
  movie = models.CharField(max_length=255)
  director = models.CharField(max_length=255)
  total_votes = models.IntegerField(default=0)
  rating = models.FloatField(default=0) 
  length = models.IntegerField(default=0)
  year = models.IntegerField(default=0)
  added_by = models.ForeignKey(User)
  slug = models.SlugField(unique=True)
  def __str__(self):
      return self.movie
########################
 Vote-model:
 ########################
class Vote(models.Model):
  class Meta:
      unique_together = (('voter_id','movie_id'),)
  movie_id = models.ForeignKey(Entry)
  voter_id = models.ForeignKey(User)
  rating = models.FloatField(validators=[MinValueValidator(0), MaxValueValidator(10)])

这是我的form.py:

class VoteForm(ModelForm):
  class Meta:
      model = Vote
      fields = ('rating',)

这是相关函数表格view.py:

def lets_vote(request, slug):
  entry = Entry.objects.get(slug=slug)

  if request.method == "POST":
      form = VoteForm(request.POST)
      if form.is_valid():
          voter_id = request.user
          movie_id = Entry.objects.get(slug=slug).movie
          post = form.save(commit=False)
          post.save()
          return redirect('/movies/')
  else:
      form = VoteForm()
  return render(request, 'list/lets_vote.html', {'entry':entry, 'form':    form})

最后但并非最不重要的一点:html页面的投票形式:

<form role="form" action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
{% endblock %}

我也在django irc上发布了这个问题,那里有人帮助我解决了问题!

我最初犯了两个错误:

  1. 我在模型中添加了一个" _id"。这已经自动这样做,因此我的数据库中的变量实际上被称为" Movie_ID_ID"。从那以后,我删除了多余的" _id"。
  2. 以下行中的'.movie'是不必要的。

    post.movie = entry.objects.get(slug = slug).movie

正确的工作视图如下:

def lets_vote(request, slug):
  entry = Entry.objects.get(slug=slug)
  form = VoteForm(request.POST)
  if request.method == "POST":
      if form.is_valid():
          post = form.save(commit=False)
          post.voter = request.user
          post.movie = Entry.objects.get(slug=slug)
          post.save()
          return redirect('/movies')

我只需要实际实例,但是@alasdair的其余部分是正确的。谢谢@Alasdair和来自IRC的Flobin!

最新更新