Django:如何为页面上的每个元素创建表单?

时间:2016-02-13 09:06:12

标签: python django django-forms django-templates

我有Post模型:

class Post(models.Model):
    text = models.CharField(max_length=10000)
    title = models.CharField(max_length=200)

在一个页面上,我获得所有Post对象。对于每个Post对象,我想在此页面上编辑此帖子。

为此,我使用隐藏字段“post_id”创建了PostEditForm以识别编辑帖子

class PostEditForm(forms.Form):
   title = forms.CharField(max_length=200)
   text = forms.CharField(widget=forms.Textarea)
   post_id = forms.IntegerField(widget=forms.HiddenInput)

我不知道如何在页面上获取此表单,以便将post_id写入隐藏字段。

2 个答案:

答案 0 :(得分:0)

Django为此特定目的提供ModelForms

class PostEditForm(forms.ModelForm):
    title = forms.CharField(max_length=200)
    text = forms.CharField(widget=forms.Textarea)

def some_view(request,some_pk):
    post = models.Post.objects.get(pk=some_pk)
    if request.POST:
        form = PostEditForm(request.POST,instance=post)
        if form.is_valid():
            # do more if you like
            form.save()
    else:
        form = PostEditForm(instance=post)

    #return response

您可以在模板中渲染隐藏的表单字段({% for field in form.hidden_fields %}{{ field }}{% endif %}),但使用此方法您不需要。

答案 1 :(得分:0)

我不认为你接近的是最简单的。最好创建一个主要用作验证器的表单:

class PostEditForm(forms.ModelForm):
    class Meta:
         model = Post

然后,您需要使用AJAX从您的字段传递数据,并使用创建的表单验证它:

var form = $('.form'); // Your forms selector
form.on('submit', function(e){
    var self = $(this),
        post_id = self.attr('data-post-id');

    $.ajax({
      url: "/some-backend-url/",
      method: 'POST',
      data: {
         post_id: post_id,
         text: $('input.text', self).val(),
         title: $('input.title', self).val(),
      },
      dataType: 'json'
    }).done(function(response) {
      // Some callback here.
    });
});

并使用您的后端更新您的帖子:

def some_view(request):
    if request.POST and request.is_ajax():
        post = models.Post.objects.get(pk=request.POST.get('post_id')
        form = PostEditForm(request.POST, instance=post)
        if form.is_valid():
            obj = form.save()
            # return json response
    return HttpResponseBadRequest

您也可以使用基于类的UpdateView执行相同的操作。