访问django formset数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问django formset数据相关的知识,希望对你有一定的参考价值。

我在django中有一个使用具有一对多关系的模型的formset。许多与会者可以参加一个单一的活动。

我在模板中发送模型的“很多”部分。问题是返回的数据没有设置主键。我收到验证错误,因为未设置formset主键数据。

回到我的观点,我知道主键应该是什么。我想在验证之前设置它。在发送表格以供显示之前,或者设置值。但我不知道如何在formset数据中设置它。

在下面的代码中,外键是event

选项1:在显示表单之前设置外键:

#models.py  - note 2 foreign keys
class Attendee(models.Model):
    event = models.ForeignKey(Event)
    sponsor = models.ForeignKey(Customer)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30) 

# forms.py
class AttendeeForm(forms.ModelForm): 
  event = forms.IntegerField(required=True, widget=forms.HiddenInput()) 

  class Meta: 
    model = Attendee 
    fields = ( 'last_name', 'first_name', ) 
    exclude = ('event', )  # excluded so user can't set foreign key

# views.py
event = get_object_or_404(Event, id=event_id)
AttendeeFormSet = inlineformset_factory(Event, Attendee, form=AttendeeForm, extra=1)
formset = AttendeeFormSet(instance=event, prefix='attendees')
# Error on form submit:  
#  Returns and redisplays the form along with message.
#  (Hidden field event) The inline foreign key did not match the parent instance primary key.


#  I also tried:  
#AttendeeFormSet = inlineformset_factory(Event, Customer, Attendee, form=AttendeeForm, extra=1)
# which gave error: 
# inlineformset_factory() got multiple values for keyword argument 'form'

选项2:在返回POST上设置外键。请注意,即使存在数据,表单也无效,因为未设置外键。

formset = AttendeeFormSet(request.POST, request.FILES, prefix='attendees')
i=0
for form in formset.forms:
   # How can I set the foreign key (event) field here?
   pdb.set_trace()

if formset.is_valid():
   attendees = formset.save_all()


(Pdb) p form.fields
{'last_name': <django.forms.fields.CharField object at 0xaa44a2c>, 
'first_name':    <django.forms.fields.CharField object at 0xaa449ec>,  
'event': <django.forms.fields.IntegerField object at 0xaa44fec>}
(Pdb) 

在我的formset中修复外键问题的最佳方法是什么?如果选项2如何在测试is_valid之前设置此字段?

答案

由于这是表示外键关系的formset,因此您应该使用inlineformset_factory来构造类。这将负责为您设置FK:

AttendeeFormSet = formset_factory(Event, Attendee, form=AttendeeForm)
...
formset = AttendeeFormSet(instance=my_event)
另一答案

如果将commit=False传递给.save(),则可以修改该对象并添加外键。

有关示例代码,请参阅Saving objects in the formset

以上是关于访问django formset数据的主要内容,如果未能解决你的问题,请参考以下文章

django 如何用formset 显示数据库里的经过 过滤的数据?用户资料和修改资料?

Django formsets没有发布数据

Django:如何使用 formset extra 更改标签?

使用 formset / managment_form 变量时,提交的 Django 表单没有 POST 数据

Django-dynamic-formsets 不工作

与 django-dynamic-formset 一起使用的 Django Formset 不显示删除链接