Обновление ModelForm Django 1.10

Я довольно новичок в кодировании в целом, поэтому, пожалуйста, простите мое невежество.

У меня есть ModelForm (Django 1.10 - на всякий случай) для публикации на сайте социальной сети:

модели.ру:

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

формы.ру:

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>

Мой вопрос: при попытке обновления, почему исходный ввод поля не отображается? Поля становятся пустыми, как будто я создаю новый пост.

Чем подробнее ответ, тем больше буду признателен. Заранее спасибо.


person Violet Rarity    schedule 09.12.2016    source источник
comment
Как выглядит form_template.html?   -  person Daniel Roseman    schedule 10.12.2016
comment
@DanielRoseman, я только что понял, что забыл о form_template.html {% для поля в форме %} ‹div class=form-group style=padding-up: 10px› ‹label class=control-label col-sm-2›{{ field.label_tag}}‹/label› ‹div class=col-sm-10›{{ field }}‹br›‹br›‹/div› ‹/div› {% endfor %} Извините за это..   -  person Violet Rarity    schedule 12.12.2016


Ответы (2)


Оказывается, все, что мне нужно было сделать, это удалить «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 Alexiy.

person Violet Rarity    schedule 13.12.2016

Если вы хотите отобразить исходные данные в форме, вам нужно добавить некоторый код в свой 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))
person Zagorodniy Olexiy    schedule 09.12.2016
comment
Спасибо за ответ. Могу я просто спросить: что такое ExtraProfileDataForm? - person Violet Rarity; 12.12.2016
comment
@ Zagorodniy Алексей, без проблем, но все равно не работает. Кто-то сказал мне, что я неправильно передаю request.GET. Есть идеи? - person Violet Rarity; 13.12.2016
comment
Я добавил код для своей модели Post. Кстати, спасибо за ваши старания. - person Violet Rarity; 13.12.2016