2016-05-21 9 views
4

のIDに応じてページにリダイレクト。ジャンゴCREATEVIEWは、フォームを保存し、私はジャンゴでCBVを勉強していますForeignKeyの

私はFlatのページを持っています。ユーザーがそのページにアパートの写真を追加できるようにしたい。

フラットの写真はモデルに保存され、UserFlatモデルで接続されます。

class Photo(models.Model): 
    photo_path = models.ImageField(verbose_name='Фотография') 
    photo_user = models.ForeignKey(User, verbose_name='Агент, добавивший фото') 
    photo_flat = models.ForeignKey(Flat, verbose_name='Квартира') 
    photo_description = models.CharField(verbose_name='Описание', max_length=200, null=True, blank=True) 

私の目標:私のモデルは次のようになり、ユーザはいくつかの写真を追加し、ボタンを押すと、画像がモデルに保存されます。ユーザーはフラットの同じ詳細ビューにリダイレクトされ、追加された画像が表示されます。

私は別のオプションを試してみたが、私はこの問題を処理するのに十分なスキルを持っていません。私は混乱します

最初の事はCreateViewtemplate_name変数です。私CREATEVIEWは、次のようになります。

class PhotoUploadView(CreateView): 
    form_class = PhotoUploadModelForm 
    template_name = 'photo_upload.html' 
    def form_valid(self, form): 
     self.instance.photo_user = self.request.user 
     self.instance.photo_flat_id = self.kwargs['flat_id'] 
     form.save() 
     return super(PhotoUploadView, self).form_valid(form) 

def get_success_url(self): 
     return reverse('flatdetail') 

私は、ユーザーに任意の別のページを表示したくない場合は?写真を投稿した後、同じフラットな詳細ビューにリダイレクトされるようにします。私は次のエラーのためCreateViewからtemplate_nameを削除することはできません。

TemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()' 

私は上記CreateViewで達成していますか?

二混乱を招く事:私はフラットな詳細ビューを写真を掲載してredirect.htmlにリダイレクトされましたが、ありません。それは良くないね。しかし、私の写真は保存されませんでした。それは非常に悪いです。私は、もちろん、そのような部屋、サイズ、価格およびなどの追加情報なしでページを示し、flatdetail.htmlからredirect.htmlを変更しようとしたがきました。

私は、この特定の状況では二つのことを達成するために何をすべき:

  1. 保存データ

  2. は、いくつかの写真を追加した後、フラット詳細ビューにユーザーをリダイレクトします。

追加情報: 私urls.py

url(r'^dev/flat/(?P<flat_id>[0-9]+)/$', views_dev.flat_ajax, name='flatdetail'), 
url(r'^dev/photo-update/(?P<flat_id>[0-9]+)/$', views_dev.PhotoUploadView.as_view(), name='image-update') 

forms.py

class PhotoUploadModelForm(forms.ModelForm): 
    class Meta: 
     model = Photo 
     fields = ['photo_path'] 

flatdetailテンプレート内のマイフォーム:

<form action="/dev/photo-update/{{flat.id}}/" method="POST"> 
{% csrf_token%} 
    <input type="file" multiple> 
    <button>Send</button> 
</form> 
+1

私の答えのコードを以前の質問に使用したので、その答えを受け入れる必要があります。 –

+0

成功しましたか、それとも助けが必要ですか?私の答えが「答え」だったらそれを受け入れるのですか? – Bono

答えて

4

私は今あなたが2つのことを混ぜていると思います。

お客様のPhotoUploadViewは、フラットな詳細ビューから完全に分離しています。 PhotoUploadView内のtemplate_name変数は、アップロードページの読み込み時に使用されるテンプレートです。これは、ファイルのアップロードに使用するHTMLを指しているはずです。

template_name = 'flat_upload_photo.html' 

現在のget_success_url()機能が正しくインデントされていないことに気付いています。これにより、クラス内で関数が認識されなくなり、そのために使用されなくなります。私はこれがStackOverflowのインデントエラーであるのか、実際のコードに存在するのか分かりません。私はまた、関数がリダイレクトのために正しい引数を持たないことも知っています。 urls.pyを見ると、flatdetailのURLにフラットIDが必要です。だからあなたのget_success_url()は(クラス内)が正しくインデントされると、次のように見えることを確認してください。

def get_success_url(): 
    return reverse('flatdetail', args=(self.kwargs['flat_id'],) 

args=(self.kwargs['flat_id'],)は、我々が探しているURLに引数を持つタプルを渡すことを確認します。具体的には、返すオブジェクトのIDです。 URL flatdetailのURLがurls.pyに指定されているため、フラットIDが必要です。

第3に、あなたのPhotoUploadViewが実際に写真をアップロードしない理由は、form.instance.photo_userの代わりにself.instance.photo_userにアクセスしたことと関係していると思います。その時点でform.save()を実行する必要はありません。これは、super()関数を呼び出すと発生するためです。

form_valid()で何が起こっているのか完全にはわかりません。おそらく、あなたが何が間違っているのかを明確にすることができれば(何か誤りがありますか?)私はあなたをより良く助けることができます。

+0

ありがとうございました。この関数を 'success_url = reverse( 'flatdetail')という文に変更すると、エラーが発生します。'含まれているURLconf 'django_project.urls'にパターンが含まれていないようです。ファイル内に有効なパターンがある場合、この問題はおそらく循環インポートによって発生します.'私はフラットのページをロードしようとするとエラーが発生しています。私は関数を 'reverse_lazy'に変更しました。そして今、私は同じエラーで画像を投稿しようとしています。 –

+0

' reverse_lazy'エラーが実際に消えていますが、私はフラットのページにリダイレクトしていません。 Djangoは空のページである 'redirect.html'をレンダリングして表示します。写真も保存されません。私はエラーを見ることができません –

+0

@ mailman_73私は私の答えを更新しました。私は実際に 'success_url'変数の使用について間違っていました。 'form_valid()'の値を正しい 'form.instance.photo_user'値で更新しましたか? – Bono

関連する問題