【问题标题】:(Django) (Foreign Key Issues) model.person_id May not be NULL(Django) (外键问题) model.person_id 可能不为 NULL
【发布时间】:2011-07-14 00:11:16
【问题描述】:

我知道这在 Django 圈子中似乎是一个被问得过多的问题,但我不敢说我​​还没有找到解决方案。

我的模型 -

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

我尝试在管理定义中覆盖 save_model() 并在 Form 中覆盖 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()} 

【问题讨论】:

标签: python django autocomplete model foreign-keys


【解决方案1】:

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

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

这很像 Ignacio 所说的进入视图,只有 commit = False 是它保存实例而不引发异常的关键语句。感谢所有帮助的人!
干杯

【讨论】:

  • 特别感谢我的伙伴 Ignacio 在我寻找圣杯时一直陪伴着我。谢谢兄弟!!!
【解决方案2】:

在您的 PersonalForm 中,您可以子类化您的 save() 函数,以便添加适当的数据,如下所示:

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

    class Meta:
        model = Personal

【讨论】:

  • 除非你不能从这里到达那里。 (提问者否认这是重复的问题的答案)
  • 嘿 Bjorn 非常感谢您的回复,我认为这可能仅适用于“请求”被称为未定义变量。我该怎么办?
  • @Ignacio - 嘿,我已经尝试过 form.person = request.user 伙计,它没有用......
  • 逻辑不应该在imho的视图中。 @Ignacio,你是对的,但是你可以传递请求对象,这里解释:stackoverflow.com/questions/631722/django-update-modelform
【解决方案3】:

看到这个

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

这可以,但是 sqlite 有问题,将其更改为 postgresql 就可以了。 (它是我的代码,将其更改为您的状态)

【讨论】:

  • 嘿,感谢 Efazati 的回复,但现在我只能使用 sqlite 人,我认为 Bjorn 的上述方法可能有效,只需要弄清楚一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多