【问题标题】:Django formset hidden foreign keyDjango formset隐藏外键
【发布时间】:2017-07-01 06:43:00
【问题描述】:

This 问答让我成功了 90%。所以感谢社区。​​p>

我有一个模型表单集,它验证并进入“如果有效”循环

models.py

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 用于反转查询集并按降序给我最后 10 个结果,以便您在表单集的底部添加一个新会话,通常是后一个会话。这是一个风格的boge

问题是当我尝试保存或编辑表单时,我得到:

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

但我可以通过在保存循环中添加“如果不是无”来避免它:

bodged 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()

我真的不知道为什么只有那个领域会导致问题。显然,这是一个完全的错误

我真的很傻吗?

【问题讨论】:

    标签: django formsets


    【解决方案1】:

    您尚未为各个字段定义null=True。如果您希望 Django 在数据库中保存空值,那么您可以更改这些行,

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

    【讨论】:

    • 谢谢,但我不希望它保存空值。这些值是必需的。每个“会话”记录都需要有一个 start_date/time 和 end_date/time,因为这是所有后续计算的基础。
    • 您的代码看起来不错。错误仍然存​​在吗??
    • 是的,如果我调试它并遍历视图中的每个“会话”,我可以看到正在发生的事情是表单集中的每个表单都被传递给保存函数,包括空的那些。我认为这些字段导致问题的原因是它们是第一个尝试保存的字段。我希望为表单集中的无效表单显示错误消息(尚未编写规则),但我不希望为空表单显示错误消息。我可以手动写,但它似乎相当不雅。
    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2010-10-11
    • 2010-10-28
    • 2015-12-29
    • 2016-04-18
    • 1970-01-01
    • 2012-04-24
    • 2019-01-03
    相关资源
    最近更新 更多