2017-08-19 140 views
0

必须有更好的方法来编写此代码。基本上,我有我的数据库中的电子邮件列表。我正在努力做出一个整洁的表格,这将有按年份和类型分开的电子邮件复选框。例如Django Multi复选框表单

一年级学生
复选框复选框

二年级的学生: .......

我的模型看起来像这样

class Email(models.Model): 
    name = models.CharField(max_length = 254) 
    email = models.EmailField(unique = True) 
    year = models.IntegerField(default=0 
    course = models.IntegerField(default=0) 
    type = models.CharField(max_length = 100) 

也是目前唯一途径我设法通过写这样的许多表格

class Emailform1(forms.Form): 
    my_models = forms.ModelMultipleChoiceField(
             widget=forms.CheckboxSelectMultiple, 
             queryset=None) 
    def __init__(self, *args, **kwargs): 
     super(Emailform1, self).__init__(*args, **kwargs) 
     self.fields['my_models'].queryset = Email.objects.filter(course = 1).filter(type="Type") 

但是,这会产生很大的麻烦与视图和一吨的形式等工作..

回答

0

不要使用有多种形式 - 你可以使用一个带有多个字段:

def get_courses_types(): 
    results = [] 
    courses = [1, 2, 3] 
    types = ['Type1', 'Type2', 'Type3'] 
    for course in courses: 
     for type in types: 
      results.append((course, type)) 
    return results 

class EmailForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(Emailform, self).__init__(*args, **kwargs) 
     for course, type in get_courses_types(): 
      field = 'field_{}_{}'.format(course, type) 
      self.fields[field] = forms.ModelMultipleChoiceField(
       widget=forms.CheckboxSelectMultiple, 
       queryset=Email.objects.filter(course=course).filter(type=type) 
      ) 

然后:

form = EmailForm(data=request.POST) 
if form.is_valid(): 
    for course, type in get_courses_types(): 
     value = form.cleaned_data['field_{}_{}'.format(course, type)] 
     # save value as you want