我有一个基于以下模型的ModelForm字段:
class Phrase(models.Model):
subject = models.ForeignKey(Entity) # Entity is unique on a per Entity.name basis
object = models.ForeignKey(Entity) # Entity is unique on a per Entity.name basismodelform (PhraseForm)有一个字段“subject”,即CharField。我希望用户能够输入一个字符串。当保存模型表单,且字符串与现有实体不匹配时,将创建一个新实体。
这就是为什么我必须覆盖Modelform的"subject“字段,因为我不能使用Modelform的自动生成的"subject”字段(我希望我在这里说清楚了)。
现在,当通过模型表单创建一个新短语时,所有测试都运行良好。但是,在修改短语时:
p = Phrase.objects.latest()
pf = PhraseForm({'subject': 'anewsubject'}, instance=p).pf.is_valid()返回False。我遇到的错误是,"object“不能是None。这是有意义的,因为对象字段确实没有被填充。
处理这件事最好的方法是什么?当然,我可以检查init()函数中是否提供了一个实例,然后从传递的实例中分配缺失的字段值。但是,这似乎并不是正确的方法,因此,是否有一种不那么麻烦的方法来确保实例的数据通过ModelForm传递?
现在我输入了这个,我想没有了,因为底层的模型字段正在被覆盖,这意味着表单字段值需要再次填充,这样一切才能正常工作。这让我重新表达了我的问题:允许用户输入免费文本并将其链接到一个新的或现有的实体的方式是正确的吗?
提前感谢!
发布于 2011-04-15 18:23:23
你为什么要用表格来修改。
p = Phrase.objects.latest()
p.subject = Entity.objects.get_or_create(name='anewsubject')[0]for get_or_create
如果您实际使用的是该表单,它应该工作得很好:
def mod_phrase(request, phrase_id=None):
phrase = get_object_or_404(Phrase, pk=phrase_id)
if request.method == 'POST':
form = PhraseForm(request.POST, instance=phrase)
if form.is_valid():
form.save()
return HttpResponse("Success")
else:
form = PhraseForm(instance=phrase)
context = { 'form': form }
return render_to_response('modify-phrase.html', context,
context_instance=RequestContext(request))设置ModelForm的实例将设置初始数据,并让表单知道表单使用的是哪个对象。在试图使用表单的方式中,您正在传递一个无效的data字典(缺乏object),该表单正确地告诉您无效。当您在上面的示例中将data设置为request.POST时,request.POST包含允许表单验证的初始数据。
https://stackoverflow.com/questions/5679579
复制相似问题