0

Post および PostImage モデルがある Django アプリがあります。

各投稿には複数の PostImage があります。

Post 追加ページには、Post と PostImages の両方のフォームがあります。PostImages にフォームセットを使用しました。ビューのコードは次のとおりです。

def post_new(request, template_name="posts/new.html"):


  post_form = Post(request.POST or None, request.FILES or None)
  PostImageFormSet = formset_factory(PostImageForm, extra=1)
  post_image_formset = PostImageFormSet(request.POST or None, request.FILES or None, prefix='post_images')

  if post_form.is_valid() and post_image_formset.is_valid():
    post = post_form.save(commit=False)
    post.save()
    for post_image_form in post_image_formset:
      post_image = post_image_form.save(commit=False)
      post_image.post = post
      post_image.save()

    redirect_url = urlresolvers.reverse('post_show')
    return HttpResponseRedirect(redirect_url)

  form_data = {'post_form': post_form, 'post_image_formset': post_image_formset}
  csrfContext = RequestContext(request, form_data)
  return render_to_response(template_name, csrfContext)

jQuery を使用して PostImage 用のフォームを追加しましたが、完全に正常に動作し、必要な数の画像を含む投稿を作成できました。

ここで、post_edit ページを同様の方法で機能させたいと考えています。post_edit ビューメソッドのコードは次のとおりです。

def post_edit(request, post_slug, template_name="developers/posts/edit.html"):
  post = get_object_or_404(post, slug=post_slug)
  post_images = PostImage.objects.filter(post_id=post.id)
  count = len(post_images)
  post_form = postForm(request.POST or None, request.FILES or None, instance=post)
  postImageFormSet = formset_factory(postImageForm, extra=count)
  post_image_formset = postImageFormSet(request.POST or None, request.FILES or None, prefix='post_images')

  for post_image_form, post_image in zip(post_image_formset.forms, post_images):
    post_image_form.initial = post_image
  if post_form.is_valid():
    post_form.save()
    redirect_url = urlresolvers.reverse('developer_post_show', args=[post_slug])
    return redirect(redirect_url)

  form_data = {'post_form': post_form, 'post_image_formset': post_image_formset}
  csrfContext = RequestContext(request, form_data)
  return render_to_response(template_name, csrfContext)

編集ページのテンプレートは次のとおりです。

{% extends "base.html" %}

{% block content %}
{% load thumbnail %}

  {% if error_message %} <p><strong>{{ error_message }}</strong></p> {% endif %}
  {{ post_form.errors }}
  <div style="width: 80%; margin: 0 auto;">
    <form action="" method="post">
      {% csrf_token %}
      <div>
        ... Post related HTML
      </div>

      <div class="post-images" style="clear: both;">
        {% for post_image_form in post_image_formset %}
          <div>
            {{ post_image_form.caption  }}
          </div>
        {% endfor %}
      </div>

      <div style="clear: both; position: relative; left: 320px;">
        <input type="submit" value = "Update post" />
      </div>

    </form>
  </div>
{% endblock %}

テンプレートに次のようなエラーが表示されます。

「PostImage」オブジェクトには属性「get」がありません

私のテンプレートでは、post_image_formsetオブジェクトを繰り返し処理します。特定の投稿には 3 つの画像があるため、3 回繰り返します。これは正しいことです。しかし、私はまだこのエラーが発生します。誰でも助けることができますか?

ありがとう。

4

1 に答える 1

0

あなたPostImageFormModelFormです。編集ビューでは、initial属性を使用して既存のインスタンスを提供します。これは推奨される方法ではなく、エラーはその兆候である可能性があります。

初期インスタンスを提供するには、 aQuerySetが使用されます。

あなたの場合、これは次のようになります。

def post_edit(request, post_slug, template_name="developers/posts/edit.html"):
    post = get_object_or_404(post, slug=post_slug)
    post_images = PostImage.objects.filter(post_id=post.id)

    PostImageFormSet = formset_factory(postImageForm, extra=2)
    formset = PostImageFormSet(queryset=post_images)

また、フォーム ビューで POST 要求と GET 要求を処理する推奨方法を使用することもできます。

于 2012-06-20T11:32:51.227 に答える