2015-11-28 63 views
0

我試圖讓自己的形式添加對象公告形式多對多對象創建

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') 

而且一切都很完美,但我必須從選擇框中選擇Person。這是預期的行爲。

但是在我的情況下,我很確定,那個人並不存在於基地(所有公告都是針對不同的人很長一段時間 - 所以我想將人員選擇框更改爲三個字段,並創建新人(新名字)每次我保存公告

我想我知道如何保存多到很多,這就是爲什麼我不把views.py,但我不知道如何設置窗體。 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
  • person__name__first_name不會在形式真正的工作,即僅適用於Django管理
  • 你必須創建一個自定義字段的名字,然後創建一個邏輯保存在任

    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() 
    
+0

我有沒有辦法從許多模型中獲取參數? (例如,如果我改變字段的大小,我不想檢查所有地方需要修改有關這一領域custom_fields。 –

+1

是可以的形式的東西構造函數方法設置的參數一樣 高清__init __(自我,parameter_id ,* args,** kwargs): rank = Rank.objects.get(id = rank_id) queryset = Rank.objects.filter(department = rank.department) self.fields ['position'] = forms.ModelChoiceField (查詢集) –