(Django) (外键问题) model.person_id 可能不能为空

3 投票
3 回答
2299 浏览
提问于 2025-04-16 13:33

我知道这个问题在Django的圈子里被问得很多,但我很遗憾地说,我还没有找到解决办法。

我的模型是 -

from djago.... import User
class InfoPersonal(models.Model):
...
person = models.OneToOneField(User)

我尝试过在管理后台的定义中重写save_model(),也尝试过在表单中重写save(),但似乎都没有效果。

如果你想自动在一个外键(ForeignKey)或一对一字段(OneToOneField)中添加数据到模型里,你会怎么做呢?

  def profile_creation_personal(request):
    if request.method == 'POST': # If the form has been submitted... 
        form = PersonalForm(request.POST) # A form bound to the POST data 
        # form.person = request.user
        if form.is_valid(): # All validation rules pass 
            # Process the data in form.cleaned_data 
            # ... 
            form.save()
            return HttpResponseRedirect('/done') # Redirect after POST
    else: 
            form = PersonalForm() # An unbound form 
    return render_to_response('info/personal/profile_create.html', { 'form': form,})


class PersonalForm(ModelForm):
    #hometown_id = ModelChoiceField(queryset=InfoReferenceCities.objects.all(),empty_label=None)
    def save(self, *args, **kwargs):
        self.person = request.user
        super(PersonalForm, self).save(*args, **kwargs)
    class Meta:
        model = InfoPersonal
        exclude = ('person',)
        widgets = {'dateofbirth' :  SelectDateWidget()} 

3 个回答

0

在你的PersonalForm中,你可以对save()这个函数进行子类化,这样就能添加合适的数据,像这样:

class PersonalForm(ModelForm):
    def save(self, *args, **kwargs):
        self.person = request.user
        super(PersonalForm, self).save(*args, **kwargs)

    class Meta:
        model = Personal
0

看看这个

parent = models.ForeignKey('self', blank=True, null=True, verbose_name=_("parent"))

这个没问题,但在使用sqlite时有点问题,换成postgresql就没事了。(这是针对我的代码,你可以根据自己的情况进行修改)

1

我找到答案了!!!我感觉很好!

personal = form.save(commit = False)
personal.person = request.user
personal.save()

这就像Ignacio说的那样进入视图,唯一需要注意的是commit = False,这个语句很重要,它可以让你保存一个实例而不会出现错误。感谢所有帮助过我的人!!
干杯!

撰写回答