2016-05-28 7 views
0

Djangoで2つのフォームを編集したいと思います。 「モーテル」とその「イメージ」の形式。私のアプリでは、ユーザーは複数の画像を「モーテル」モデルにアップロードできます。そして今、関数 'get()は' で画像を編集するには、フォームGet()関数で複数のオブジェクトを編集するDjango

def create_motel(request): 
    if request.method=="POST": 

     motelForm= MotelForm(request.POST, request.FILES) 
     formset=MotelImagesForm(request.POST, request.FILES) 

     if motelForm.is_valid() and formset.is_valid(): 

      human= True 

      motel_form= motelForm.save(commit=False) 
      motel_form.user= request.user 
      motel_form.pub_date= datetime.datetime.now() 
      motel_form.save() 

      for image in request.FILES.getlist('image',[]): 
       photo= MotelImages(motel=motel_form, image=image) 
       photo.save() 

      messages.success(request, 
         "Welldone Boy") 
      return HttpResponseRedirect('/view_all/') 
     else: 
      print motelForm.errors, formset.errors 

    else: 
     motelForm=MotelForm() 
     formset= MotelImagesForm() 
     return render(request, 'motels/add_motel.html',{'motelForm': motelForm, 'formset':formset}) 
フォーム

を編集するための

ビューを保存するための

MultipleObjectsReturned get() returned more than one MotelImages -- it returned 4! 

モデル

class Motel(models.Model): 
    user= models.ForeignKey(User) 
    title= models.CharField(max_length=120) 
    body= models.TextField() 
    #other fields 

class MotelImages(models.Model): 
    motel= models.ForeignKey(Motel, default=None, related_name='images') 
    image= models.ImageField(upload_to='company', verbose_name= 'Image') 

class MotelImagesForm(forms.ModelForm): 
    image= forms.ImageField(label='Image',) 

    def __init__(self, *args, **kwargs): 
     super(MotelImagesForm,self).__init__(*args, **kwargs) 
     self.fields['image'].widget= forms.FileInput(attrs={'name':'image', 
                 'multiple':'multiple'}) 

ビューを、私を与えています

@login_required 
def edit_motel(request,motel_id=None,slug=None,template_name='motel_edit.html'): 
    if id: 
     post=get_object_or_404(Motel,id=motel_id,slug=slug) 
     images=MotelImages.objects.get(motel=motel_id) 
    else: 
     post=Motel(user=request.user) 
     images=MotelImages(user=request.user) 
    if request.POST: 
     motelform=MotelForm(request.POST,request.FILES, instance=post) 
     formset=MotelImagesForm(request.POST,request.FILES, instance=images) 

     if form.is_valid() and formset.is_valid(): 
      form.save() 
      formset.save() 
      redirect_url=reverse('moteldetail',kwargs={'motel_id':motel_id,'slug':slug}) 
      return render(request, 'motels/updatenotice.html') 

    else: 
     form=MotelForm(instance=post) 
     formset= MotelImagesForm(instance=images) 
    return render(request, template_name,{'formset':formset,'motelform':motelform}) 

テンプレートfor ediフォームを参照する

<form id="post_form" method="post" action="" 
     enctype="multipart/form-data"> 

    {% csrf_token %} 
    {% for hidden in motelform.hidden_fields %} 
     {{ hidden }} 
    {% endfor %} 

    {% for field in motelform %} 
     {{ field.name }} 
     {{ field }} <br /> 
    {% endfor %} 

    {{ formset.management_form }} 
      {% for form in formset %} 
      {{ form }} 
    {% endfor %} 
    <input type="submit" name="submit" value="Submit" /> 
</form> 

私は何が欠けていますか?

+0

'if id:'または 'if motel_id:'をしたいですか? – Evert

答えて

0

images = MotelImages.objects.get(motel=motel_id)

getは、1つのオブジェクトのみを返すことができるので、あなたはfilterを使用したい:

images = MotelImages.objects.filter(motel__pk=motel_id)

imagesは、関連する画像の一覧となります。

+0

filter()が私に 'QuerySet'オブジェクトに属性 '_meta'を与えていない – YoYo

+0

申し訳ありませんが、それは外来キーではありませんでした。更新された回答でもう一度お試しください。 – DeepSpace

+0

でも同じエラーが発生します。 'QuerySet'オブジェクトには属性 '_meta'がありません – YoYo

関連する問題