更新ModelForm Django 1.10

时间:2016-12-09 21:07:34

标签: python django social-networking modelform updatemodel

我对编码很新,所以请原谅我的无知。

我有一个模型结构(Django 1.10 - 仅限于案例 - )用于'帖子'在社交网络网站上:

models.py:

class Post(models.Model):
   user = models.ForeignKey(User)
   text = models.TextField()
   image = models.ImageField(blank=True)
   draft = models.BooleanField(default=False)
   submission_date = models.DateTimeField(auto_now_add=True)

   def __unicode__(self):
       return self.text

forms.py:

class PostForm(forms.ModelForm):
    class Meta:
         model = Post
         fields = ['text', 'image', 'draft']

要更新帖子,这是它的功能: views.py:

def edit_post(request, post_id):
  post = get_object_or_404(Post, pk=post_id)

  if not request.user.is_superuser and\
  not request.user == post.user:
    raise PermissionDenied

  if request.method == 'POST':
    form = PostForm(request.POST, instance=post)
    if form.is_valid():
      post = form.save(commit=False)
      post.user = request.user
      post.save()
      context = {'post': post,'form': form}
      return HttpResponse(render(request, 'accounts/view_post.html', context))

   elif request.method == 'GET':
     form = PostForm(request.GET, instance=post)
     context = {'post': post,'form': form}
     return HttpResponse(render(request, 'accounts/edit_post.html', context))

在模板中:

<form action="" method="post" enctype="multipart/form-data">
{% csrf_token %}
{% include 'accounts/form_template.html' %}
<input class="btn btn-btn-success" type="submit" value="Save Post">
</form>

我的问题是:在尝试更新时,为什么原始字段输入不显示?这些字段显示为空,就好像我正在创建一个新帖子一样。

答案越详细,我就越感激。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

原来我需要做的就是删除&#39; request.GET&#39;: 在views.py中:

def edit_post(request, post_id):
     post = get_object_or_404(Post, pk=post_id)
     ...
     ...
    elif request.method == 'GET':
         form = PostForm(instance=post)

         context = {'post': post,
                    'form': form}
         return HttpResponse(render(request, 'accounts/edit_post.html', context))

感谢所有试图提供帮助的人,特别是@Zagorodniy Olexiy。

答案 1 :(得分:-1)

如果您想在表单中显示原始输入,则必须在PostForm中添加一些代码:

class PostForm(forms.ModelForm):
  class Meta:
    model = Post
    fields = ['text', 'image', 'draft']

  def __init__(self, *args, **kwargs):
    super(PostForm, self).__init__(*args, **kwargs)
    for key in self.fields:
      self.fields[key].required = False

然后你必须把它加载到视图

def edit_post(request, post_id):
    post = get_object_or_404(Post, pk=post_id)
    if not request.user.is_superuser and\
    not request.user == post.user:
        raise PermissionDenied

    if request.method == 'POST':
        form = PostForm(request.POST, request.FILES, instance=post)
        if form.is_valid():
            post = form.save(commit=False)
            post.user = request.user
            post.save()
            context = {'post': post,
                       'form': form}
            return HttpResponse(render(request, 'accounts/view_post.html', context))

    elif request.method == 'GET':
        form = PostForm(request.GET, instance=post)

        context = {'post': post,
                   'form': form}
        return HttpResponse(render(request, 'accounts/edit_post.html', context))