我有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写入隐藏字段。
答案 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
执行相同的操作。