具有许多对象创建的表单

时间:2015-11-28 23:10:54

标签: django django-forms

我正在尝试创建自己的表单添加对象公告

models.py:

class Announcement(models.Model):
  person = models.ForeignKey('Person')
  source = models.CharField(max_length=30)
  date = models.DateField(default=datetime.now())
  valid_date = models.DateField(null=True,blank=True)

class Person(models.Model):
  names = models.ManyToManyField('Name')
  birth_date = models.DateField(null=True, blank=True)

class Name(models.Model):
  first_name = models.CharField(max_length=50,blank=True)
  middle_name = models.CharField(max_length=50, blank=True)
  last_name = models.CharField(max_length=50, blank=True)

(它可能很奇怪,但在我的概念中,每个人可以拥有多个名称,同样的名称也可以分配给不同的人)

forms.py

from django import forms
from backoffice.models import Announcement

class AnnouncementForm(forms.ModelForm):
  class Meta:
    model = Announcement
    fields = ('person','signature','organisation','source', 'date')

一切都很完美,但我必须从选择框中选择人。这是预期的行为。

但在我的情况下,我确定,那个人不存在于基地(所有公告都是针对不同的人很长一段时间 - 所以我想将人选择框更改为三个字段,并创建新人(每次我保存公告时都会有新名字。

我想我知道如何保存多对多,这就是为什么我不放置views.py,但我不知道如何设置forms.py来获取字段。

我试过

class AnnouncementForm(forms.ModelForm):
  class Meta:
    model = Announcement
    fields = ('person__names__first_name','signature','organisation','source', 'date')

但获得了Unknown field(s) (person__names__first_name) specified for Announcement

1 个答案:

答案 0 :(得分:1)

  • person__name__first_name不会真正用于表单,只适用于django admin
  • 您必须为名字创建自定义字段,然后创建一个用于保存的逻辑

    def clean(self):
     // logic here
    

    def save(self, commit=True):
     // put clean data here
     announcement_form = super(AnnouncementForm, self).save(commit=False)
     announcement_form.save()