【问题标题】:How to store data in Django Model without having an input field如何在没有输入字段的情况下将数据存储在 Django 模型中
【发布时间】:2010-10-22 02:24:17
【问题描述】:

我有这样的模型:

class Meeting(models.Model):
    date = models.DateTimeField(default=datetime.datetime.now)
    team = models.CharField(max_length=100)

    class Meta:
        verbose_name_plural = u'Meetings'
        ordering = ['-date', 'team']

    def __unicode__(self):
        return u'%s %s' % (self.date, self.team)


class Entry(models.Model):
    meeting = models.ForeignKey(Meeting, blank=True)
    meeting_date = models.DateField(null=True)
    description = models.TextField()

    class Meta:
        verbose_name_plural = u'Entries'

    def __unicode__(self):
        return self.title

我有一个表单来控制输入

class MyEntryAdminForm(forms.ModelForm):
class Meta:
    model = Entry

我正在获取会议字段的数据

meeting = forms.ModelChoiceField(queryset=Meeting.objects.all(), empty_label=None)

我想提取会议字段的日期部分(我可以管理它)。此日期部分应该是 meeting_date 字段的输入。 meeting_date 字段在表单中没有输入字段,应自动填充。 我不知道如何将这个日期提取到 meeting_date 字段以及如何存储它

def clean(self) 中的尝试

cleaned_data['meeting_date'] = date_extract_from_meeting 

没用

非常感谢任何帮助

【问题讨论】:

  • 您是否打算在未来的某个时间更改 meeting.date 或 entry.meeting_date?如果没有,那么您似乎应该只使用 entry.meeting.date 而不是复制数据。

标签: django django-models django-admin django-forms


【解决方案1】:

可能有一种方法可以覆盖表单 save() 方法并在该步骤中输入日期,但我找不到任何这样做的示例。

我知道肯定会起作用的一种方法是将 commit=False 传递给 form.save(这样实际的数据库插入还没有发生):

instance = form.save(commit=False)

然后你可以设置会议日期并保存对象:

instance.meeting_date = instance.meeting.date
instance.save()

希望这会有所帮助。

【讨论】:

  • +1:我认为这是 Django 中存在 commmit=False 的原因之一。
  • 看起来不错,但我还是迷路了。这是在什么位置。是在 MyEntryAdminForm(forms.ModelForm): 中还是在 EntryAdmin(admin.ModelAdmin) 类中:
  • 我明白了: def save_model(self, request, obj, form, change): obj.meeting_date = str(obj.meeting)[0:16] obj.save() 可以。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-22
  • 2013-02-13
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多