2017-07-01 10 views
0

This質問と回答が私のところに90%あります。コミュニティに感謝します。Django formset hidden foreign key

は私が

models.pyを検証し、 '有効な場合は、' ループに入りmodelformsetを、持っている

class session_log(models.Model): 
    anaesthetist_id = models.ForeignKey('auth.User') 
    session_start_datetime = models.DateTimeField(blank=False) 
    session_end_datetime = models.DateTimeField(blank=False) 
    session_type= models.ForeignKey(session_types, null=True, blank=True) 
    session_comments=models.TextField(null=True, blank=True) 

    def __unicode__(self): 
     return str(self.anaesthetist_id)+" "+str(self.session_start_datetime.date())+" "+str(self.session_type) 

forms.py

class SessionList(forms.ModelForm): 

    session_comments = forms.CharField(required=False, widget=forms.Textarea(attrs={'rows':1})) 
    session_start_datetime = forms.DateTimeField(input_formats=['%d/%m/%y %H:%M',], widget=forms.DateTimeInput(format="%d/%m/%y %H:%M"))  
    session_end_datetime = forms.DateTimeField(input_formats=['%d/%m/%y %H:%M',], widget=forms.DateTimeInput(format="%d/%m/%y %H:%M"))  

    class Meta: 
     model = session_log 
     exclude = ('anaesthetist_id',) 
     fields = ['session_start_datetime', 'session_end_datetime', 'session_comments','session_type'] 

views.py

def session_overview(request): 


    SessionListFormSet = modelformset_factory(session_log, form=SessionList, extra = 10, exclude =('anaesthetist_id',), can_delete=True) 
    x = session_log.objects.filter(anaesthetist_id=request.user.id).count() 
    y = x-10 
    initialformset = SessionListFormSet(queryset=session_log.objects.filter(anaesthetist_id=request.user.id).order_by("session_start_datetime")[y:]) 
    if request.method == 'POST':  
     submitted_data = SessionListFormSet(data=request.POST) 
     if submitted_data.is_valid(): 
      for session in submitted_data: 
       new_session = session.save(commit=False) 
       new_session.anaesthetist_id = request.user 
       new_session.save() 

xおよびy ar eを使用してクエリーセットを逆順にし、最後の10個の結果を降順で返すようにして、新しいセッション(通常は後のセッション)をformsetの最後に追加します。それは文体bodge

だ問題は、私が試してみて、私が手にフォームを保存または編集するときにということである。

IntegrityError at /trainee/dataentry/ 
NOT NULL constraint failed: trainee_session_log.session_end_datetime 

しかし、私は保存ループで「Noneでない場合は、」追加することによって、それをbodgeことができます。

は、私はそれだけでそれが問題を引き起こしている分野である理由として損失で真に午前views.py

if request.method == 'POST':  
    submitted_data = SessionListFormSet(data=request.POST) 
    if submitted_data.is_valid(): 
     for session in submitted_data: 
       new_session = session.save(commit=False) 
       new_session.anaesthetist_id = request.user 
       if new_session.session_end_datetime is not None: 
        new_session.save() 

bodged。明らかにそれは合計のボギーです

私は本当に馬鹿ですか?

答えて

0

それぞれのフィールドにnull=Trueを定義していません。 Djangoがデータベースにnull値を保存したい場合は、

session_start_datetime = models.DateTimeField(null=True, blank=True) 
session_end_datetime = models.DateTimeField(null=True, blank=True) 
+0

ありがとうございますが、私はnull値を保存しません。これらの値は必須です。すべての 'セッション'レコードは、それ以降のすべての計算の基礎となるstart_date/timeとend_date/timeを持つ必要があります。 –

+0

あなたのコードはうまくいくようです。エラーは引き続き発生しますか? – zaidfazil

+0

はい、私はそれをデバッグし、ビュー内の各 'セッション'をループすると、何が起こっているのかは、フォームセットのすべてのフォームが空のものを含む保存関数に渡されていることがわかります。それらのフィールドが問題を引き起こしている理由は、それらが最初に保存しようとしているということです。私はエラーメッセージがformset内の有効でないフォーム(まだ書かれているルール)で表示されるようにしたいが、私は空のフォームのエラーメッセージを望まない。私は手動でそれを書くことができますが、それはむしろ控えめであるようです。 –