0

1対多の関係を持つモデルを使用するdjangoのフォームセットがあります。多くの参加者が1つのイベントに参加できます。

モデルの「多くの」部分をフォームセットで送信しています。問題は、データが主キーが設定されていない状態で返されることです。フォームセットの主キーデータが設定されていないため、検証エラーが発生します。

私の見解に戻ると、主キーが何であるかを知っています。そして、検証前に設定したいと思います。それか、フォームを送信して表示する前に値を設定してください。しかし、フォームセットデータに設定する方法がわかりません。

以下のコードでは、外部キーは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) 

フォームセットの外部キーの問題を修正する最良の方法は何ですか?オプション2の場合、テストする前にこのフィールドを設定するにはどうすればよいis_validですか?

4

2 に答える 2

0

に渡すcommit=False.save()、オブジェクトを変更して外部キーを追加できます。

コード例については、フォームセットへのオブジェクトの保存を参照してください。

于 2012-06-25T06:13:35.950 に答える
0

これは外部キー関係を表すフォームセットであるためinlineformset_factory、クラスの構築に使用する必要があります。これで、FKの設定が処理されます。

AttendeeFormSet = formset_factory(Event, Attendee, form=AttendeeForm)
...
formset = AttendeeFormSet(instance=my_event)
于 2012-06-25T08:02:56.253 に答える