2015-11-18 127 views
0

我想在一种形式中使用两种模型。模型有很多关系,那么最好的解决方案是什么?我尝试了formset,但我只看到一个模型的字段,而不是两个字段。一种形式的多个模型

我的模型:

class Event(models.Model): 
    title = models.CharField(max_length=100) 
    description = models.TextField(max_length=400) 
    location = models.CharField(max_length=100) 

class EventTime(models.Model): 
    start_time = models.DateTimeField() 
    event = models.ManyToManyField(Event) 

回答

3

定义模型形式为每个表单。

class EventForm(forms.ModelForm): 
    class Meta: 
     fields = ('title', 'description', 'location') 

class EventTimeForm(forms.ModelForm): 
    class Meta: 
     fields = ('start_time',) 

注意,event领域已经被排除在外,因为我们希望将事件时间对象链接到我们正在创造新的事件。

在您看来,您需要将两个表单都传递给模板上下文。采用多种形式时,使用前缀是一个好主意,它可以防止在request.POST

event_form = EventForm(prefix="event") 
event_time_form = EventTimeForm(prefix="eventtime") 

冲突在模板字段名称,您可以在同一个表单标签多种形式。

<form method="post"> 
    {{ event_form }} 
    {{ event_time_form }} 
</form> 

处理POST请求时,请检查两个表单是否有效。保存两个表单后,您可以将事件和事件时间链接在一起。

event_form = EventForm(request.POST, prefix="event") 
event_time_form = EventTimeForm(request.POST, prefix="eventtime") 

if event_form.is_valid() and event_time_form.is_valid(): 
    event = event_form.save() 
    event_time = event_time_form.save() 
    event_time.event.add(event) 
+0

前缀非常好,但有一个陷阱:如果您想在表单有效时访问字段值,请从名称字段中删除前缀;例如'if event_form.is_valid():thetitle = event_form.cleaned_data ['title']' –