2016-02-13 63 views
0

我发表的模型:Django的:如何创建页面上的每个元素的形式?

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

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

对于这一点,我创建PostEditForm与隐藏字段“POST_ID”,以确定后期编辑

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已经写在一个隐藏字段。

回答

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了。

+0

谢谢!在attr'data-post-id'中写下“post_id”非常好的主意 –

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 %})渲染隐藏的表单字段,但使用这种方法,你不应该需要。

相关问题