创建django表单的简单方法是什么

时间:2016-01-19 07:17:03

标签: django django-forms

例如我有学生模型

class Student(models.Model):
    first_name = models.CharField(max_lenght=100)
    last_name = models.CharField(max_lenght=100)
    learning_group = models.CharField(max_lenght=100)

所以我想为某个小组中的每个学生创建以下表格:

|学生|马克|缺席|

|约翰史密斯|输入标记|输入缺席时间|

感谢您的帮助。

编辑:

我在JSonField()中存储我的缺席和标记字段,它看起来像这样 {student_pk:1,标记:5,缺席:3}
那我做了什么:

起初我尝试通过覆盖forms.Form init 方法来实现它,但格式错误

def MarkBookForm(forms.Form):
    def __init__(self, *args, **kwargs):
        self.students = kwargs.pop('students', None)
        super(MarkBookForm, self).__init__(*args, **kwargs)
        for student in self.students:
            self.fields["student_{}".format(student.pk)] = forms.CharField(initial="{} {}".format(student.first_name, student.last_name)
            self.fields["mark_{}".format(student.pk)] = forms.FloatField()
            self.fields["absent_{}".format(student.pk)] = forms.FloatField()

这就是我想要的 enter image description here

这就是我所做的

enter image description here

1 个答案:

答案 0 :(得分:1)

首先,您应该为markabsent定义模型 你可以像这样使用(未经测试:)):

models.py:

    class MyModel(models.Model):
        field1 = models.CharField(max_length=40, blank=False, null=False)
        field2 = models.CharField(max_length=60, blank=True, null=True)

forms.py:

    class FormForMyModel(forms.Form):
        form_field1 = forms.CharField(max_length=40, required=True)
        form_field2 = forms.CharField(max_length=60, required=False)

views.py:

    def create_a_my_model(request):
        if request.method == 'POST':
            form = FormForMyModel(request.POST)
            if form.is_valid():
                my_model = MyModel()
                my_model.field1 = form.cleaned_data.get('form_field1', 'default1')
                my_model.field2 = form.cleaned_data.get('form_field2', 'default2')
                my_model.save()
        else:        
            form = FormForMyModel()
        context_data = {'form': form}
        return HttpResponse('templtate.html', context_data)

以上示例概述了通用表单工作流程。

您可以在上面的示例中发现两个烦人的问题:

  1. 我必须分别在MyModelFormForMyModel上的字段定义字段。但是,这两个字段组(类型)之间存在很多相似之处,因此这是一种重复的工作。添加标签,验证器等时,相似性会增加。
  2. 创建MyModel实例有点傻,必须手动分配所有这些值。
  3. 这是 ModelForm 的用武之地。

    回到这两个问题:

    1. 我只是在model = MyModel类中定义Meta,而不是为每个模型字段定义表单字段。这指示表单从模型字段自动生成表单字段。

    2. 模型表单有save方法可用。这可以用于在视图中的一行中创建模型实例,而不是手动分配逐个字段。

    3. 因此,让我们使用ModelForm

      制作上面的示例
      models.py:
      
          class MyModel(models.Model):
              field1 = models.CharField(max_length=40, blank=False, null=False)
              field2 = models.CharField(max_length=60, blank=True, null=True)
      
      forms.py:
      
          class MyModelForm(forms.ModelForm):  # extending ModelForm, not Form as before
              class Meta:
                  model = MyModel
      
      views.py:
      
          def create_a_my_model(request):
              if request.method == 'POST':
                  form = MyModelForm(request.POST)
                  if form.is_valid():
                      # save the model to database, directly from the form:
                      my_model = form.save()  # reference to my_model is often not needed at all, a simple form.save() is ok
                      # alternatively:
                      # my_model = form.save(commit=False)  # create model, but don't save to database
                      # my.model.something = whatever  # if I need to do something before saving it
                      # my.model.save()
              else:        
                  form = MyModelForm()
              context_data = {'form': form}
              return HttpResponse('templtate.html', context_data)