【问题标题】:Updating ModelForm Django 1.10更新 ModelForm Django 1.10
【发布时间】:2016-12-09 21:07:33
【问题描述】:

总的来说,我对编码还很陌生,所以请原谅我的无知。

我有一个 ModelForm(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']

要更新帖子,这是它的功能: 视图.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>

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

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

【问题讨论】:

  • form_template.html 长什么样子?
  • @DanielRoseman,我刚刚意识到我忘记了 form_template.html {% for field in form %}
    {{ field }}

    {% endfor %} 很抱歉..

标签: python django social-networking modelform updatemodel


【解决方案1】:

原来我需要做的就是删除“request.GET”: 在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。

【讨论】:

    【解决方案2】:

    如果您想在表单中显示原始输入,您必须在 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))
    

    【讨论】:

    • 感谢您的回复。请问:ExtraProfileDataForm 是什么?
    • @Zagorodniy Olexiy,没问题,但它仍然无法正常工作。有人告诉我,我没有正确传递 request.GET。有什么想法吗?
    • 我为我的 Post 模型添加了代码。顺便说一句,感谢您的努力。
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 2021-10-03
    • 2012-04-29
    • 2014-03-03
    • 2012-04-29
    • 2012-01-03
    • 2015-12-22
    • 2018-05-11
    相关资源
    最近更新 更多