django在表单提交后添加外键值

smi*_*omb 1 python django

一个后ModelForm已经提交,我怎么可以添加一个外键关系,让她能够验证?

models.py

class Comment(models.Model):
    id = models.AutoField(primary_key=True)
    activity = models.ForeignKey(Activity)
    submitter = models.ForeignKey(User)

    creation_date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
Run Code Online (Sandbox Code Playgroud)

forms.py

class CommentForm(forms.ModelForm):
    content = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Comment
Run Code Online (Sandbox Code Playgroud)

views.py

def index(request, id=None):
    activity_instance = Activity.objects.get(pk=1)
    submitter_instance = User.objects.get(id=1)

    newComment = CommentForm(request.POST)
    newComment.activity = activity_instance
    newComment.submitter = submitter_instance

    if newComment.is_valid():      # <-- false, which is the problem
Run Code Online (Sandbox Code Playgroud)

Sha*_*ang 5

我认为你正在将表单实例与模型实例混合在一起.你newComment是一个表单,将其他对象指定为表单属性不会使表单保存外键(不知道你在哪里找到这种用法),因为所有表单数据都保存在form.data其中,这是一个类似于数据结构的字典.

我不确定你的表单是什么样的,因为你没有排除外键,所以它们应该作为下拉列表呈现,你可以选择它们.如果您不希望用户选择外键但选择按照您当前的方式分配值,则应将其排除在表单中,以便form.is_valid()通过:

class CommentForm(forms.ModelForm):
    content = forms.CharField(widget=forms.Textarea)

    class Meta:
        model = Comment
        exclude = ('activity', 'submitter')
Run Code Online (Sandbox Code Playgroud)

views.py

def index(request, id=None):
    activity_instance = Activity.objects.get(pk=1)
    submitter_instance = User.objects.get(id=1)

    comment_form = CommentForm(request.POST)
    if comment_form.is_valid():
        new_comment = comment_form.save(commit=False)
        new_comment.activity = activity_instance
        new_comment.submitter = submitter_instance
        new_comment.save()
Run Code Online (Sandbox Code Playgroud)

关于save()方法的 Django doc .