在views.py中使用类创建表单时,表单操作在django中的工作原理

时间:2016-07-27 15:20:45

标签: python django forms django-forms

我正在基于我的模型在django中构建一个表单。我在views.py中有这个:

class GroupCreateView(CreateView):
    model = Group
    form_class = GroupForm
    template_name = 'ipaswdb/group/group_form.html'

模板看起来很好用一些漂亮的表单css和一个datepicker等。我还创建了一个表单,以便在forms.py

中添加小部件
class GroupForm(forms.ModelForm):
    notes=forms.CharField(widget = forms.Textarea)
    billing_address = forms.ModelChoiceField(queryset=Address.objects.all(), widget=forms.Select(attrs={'tabindex':'5'}))
    start_date = forms.DateField(widget=forms.TextInput(attrs=
                                {
                                    'class':'datepicker',
                                    'tabindex' : '5',
                                    'placeholder' : 'Groups start date'
                                }))

    class Meta:
        model=Group
        exclude = ['created_at', 'updated_at']

这一切对我来说都是有意义的,我可以看到表单是如何基于我的模型构建的,并在ModelChoiceField等中填充了一些东西。我只是不确定我的views.py中的def some_method如何进入玩。因此,在表单操作的表单模板中,我有这个:

<h1> Add a new Group </h1>
    <form action="." method="post">
    {% csrf_token %}
  <div class="col-2">
    {{ form.group_name.errors }}
    <label>
      Group Name:
      <input placeholder="Enter the groups name" id="id_group_name" name="group_name" tabindex="1">
    </label>
  </div>
  <div class="col-2">
        {{ form.group_contact.errors }}

    <label>
      Gorup Contact
      <input placeholder="Enter the groups contact name" id="id_group_contact" name="group_contact" tabindex="2">
    </label>
  </div>

  <div class="col-2">
    {{ form.tin.errors }}
    <label>
      TIN Number
      <input placeholder="Groups TIN#" id="id_tin" name="tin" tabindex="3">
    </label>
  </div>
  <div class="col-2">
    {{ form.npi.errors }}
    <label>
      NPI Number
      <input placeholder="Groups NPI#" id="id_npi" name="npi" tabindex="4">
    </label>
    etc etc etc

我认为在视图中调用了一些默认方法?我只是不确定那个方法是什么。这也是为了添加一个新组,我猜我需要另一个视图或其他东西来处理他们正在编辑已经存在的组的情况?这个我正在使用的博客演示在views.py中完成了所有的一个使用forms.py以及这里没有类GroupCreateView(CreateView):esque方法在示例中我在views.py中工作,有这个方法(注意不是我的方法):

def post_detail(request, year, month, day, post):
    post = get_object_or_404(Post, slug=post,
                            status='published',
                            publish__year=year,
                            publish__month=month,
                            publish__day=day)

    comments = post.comments.filter(active=True)
    #their form stuff
    if request.method == 'POST':
        comment_form = CommentForm(data=request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.post = post
            new_comment.save()
    else:
            comment_form=CommentForm()

    return render(request,
                    'blog/post/detail.html',
                    {'post': post, 'comments':comments, 'comment_form':comment_form})

我的问题是(我不记得引用它的例子)但class GroupCreateView(CreateView):真正做的是什么?如何获得它引用/创建的表单以回来调用正确的操作最终让我验证并保存到数据库?

另外一个部分是,我怎么能(粗略地)扩展它来处理它添加一个新组的情况,也可能是另一种情况,它正在编辑现有的一个? (我在这里问第二个问题,因为我确信这与第一个问题有关。)

来自我的urls.py

    url(r'group/add/$', GroupCreateView.as_view(), name='group-add'), 

1 个答案:

答案 0 :(得分:1)

不要害怕阅读django的源代码:P,泛型类有两种方法:&#34; get&#34;和&#34;发布&#34; (和&#34; put&#34;但它会调用&#34; post&#34;)如果需要,你可以覆盖它们中的任何一个。

class BaseCreateView(ModelFormMixin, ProcessFormView):
    """
    Base view for creating an new object instance.

    Using this base class requires subclassing to provide a response mixin.
    """
    def get(self, request, *args, **kwargs):
        self.object = None
        return super(BaseCreateView, self).get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.object = None
        return super(BaseCreateView, self).post(request, *args, **kwargs)

但它也继承了它父母的方法,所以它可能有点难以阅读。我总是检查docs for the generic views,它为您提供了可以覆盖每个泛型类的所有方法的列表。现在你可以覆盖你想要的所有方法而不重复代码(这就是为什么我&lt; 3 CBV)

我认为在您的情况下,您可能希望在重定向到成功页面之前覆盖form_valid()方法以执行某些操作

希望这有帮助