2012-06-18 67 views
0

我有一個Django應用程序,其中有Post和PostImage模型。Django - 具有一對多關係的模型的更新頁面

每個帖子都有多個PostImages。

在帖子添加頁面中,我有Post和PostImages的表單。我爲PostImages使用了formset。下面是視圖代碼:

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張圖片。但我仍然得到這個錯誤。誰能幫忙?

謝謝。

+0

向我們展示引發錯誤的模板部分。爲什麼它會嘗試調用'get'?聽起來像訪問變量時的一個小錯誤。 –

+0

我更新了我的問題,爲編輯頁面添加了我的模板。在模板中,我剛剛嘗試訪問post_image標題。謝謝。 – rookieRailer

+0

如果您只是說「{{post_image_form}}」,甚至用「{{post_image_formset}}」替換整個for循環會發生什麼?它會拋出同樣的錯誤嗎? https://docs.djangoproject.com/en/1.4/topics/forms/formsets/#using-a-formset-in-views-and-templates –

回答

0

您的PostImageFormModelForm。在編輯視圖中,您使用initial屬性來提供現有的實例。這不是推薦的方式,你的錯誤可能是一個症狀。

To provide initial instances a QuerySet is used.

你的情況,這將是這樣的:

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 vs. GET requests in form views的推薦方式。

相關問題