我已经尝试了几乎所有我能找到的关于此的内容,但我很确定我只是一个小小的建议,而不是解决我的问题。
我正在尝试保存到我使用Django的表单方法同时生成的表单。这些表单具有ForeignKey关系。
我的模特:
class Publisher(models.Model):
company = models.CharField(max_length=255)
address1 = models.CharField(max_length=255)
address2 = models.CharField(max_length=255)
city = models.CharField(max_length=255)
zipcode = models.CharField(max_length=10)
email = models.EmailField(max_length=255)
firstname = models.CharField(max_length=255)
lastname = models.CharField(max_length=255)
tc = models.BooleanField()
timestamp = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.company
class PublisherQuestions(models.Model):
referal = models.TextField()
updates = models.BooleanField()
publisher = models.ForeignKey(Publisher)
preferredCommunication = models.ForeignKey(PublisherCommunication)
def __unicode__(self):
return self.publisher
class PublisherForm(ModelForm):
class Meta:
model = Publisher
class PublisherQuestionsForm(ModelForm):
class Meta:
model = PublisherQuestions
exclude = ('publisher')
和我的观点:
def register(request):
if request.method == 'POST':
form = PublisherForm(data = request.POST)
formQuestions = PublisherQuestionsForm(data = request.POST)
if form.is_valid() and formQuestions.is_valid():
publisher = form.save()
formQuestions.publisher = publisher
formQuestions.save()
return HttpResponseRedirect('/thanks/')
因此,我尝试做的是将外键发布者的第二个表单“formQuestions”与PublisherForm中的publisher_id一起保存。
不幸的是MySQL / Django给了我以下错误。
Column 'publisher_id' cannot be null
这可能是一个完整的新手问题,是的,有很多人问过几乎相同,但没有一个解决方案适合我。
感谢您的帮助,一如既往地感谢!
答案 0 :(得分:1)
您可以尝试以下操作来检查是否收到相同的错误:
publisher = form.save()
questions = formQuestions.save(commit=False)
questions.publisher = publisher
questions.save()
使用commit=False
,您可以获得Model
而不将其保存到数据库中。
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-save-method
实际上,您想要操作Model
,添加Publisher
而不是表单。
如果您需要从表单中访问数据,我认为您应该使用例如: https://docs.djangoproject.com/en/dev/ref/forms/api/#accessing-clean-data
我如何理解你有一个ModelForm
而不是Model
,所以如果你想操纵Model
,你首先需要创建它,或者至少它是操纵Model
数据最干净的方法。否则你可以操纵Form
数据,但这是另一个故事,你想选择原始数据或干净的数据等。