0

私はdjangoでCBVを研究します。 私はアパートの特定のカードに画像をアップロードすることができます。 だからモデルが作成されました:Django。 CreateViewでForeignKeyオブジェクトのIDを取得する

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) 

フォームの初期データはphoto_userとphoto_flatです。 1つまたは複数の画像をページのフォームに保存しようとすると、AttributeErrorが表示されます。

class PhotoUploadModelForm(forms.ModelForm): 

    class Meta: 
     model = Photo 
     fields = ['photo_path','photo_user','photo_flat','photo_description' 

マイCREATEVIEW:

'NoneType' object has no attribute 'pk' 

私のModelFormはこのようになります

class PhotoUploadView(CreateView): 
    form_class = PhotoUploadModelForm 
    def get_initial(self): 
     return {'photo_user': self.request.user, 
       'photo_flat': self.object.pk 
       } 
    def get_success_url(self): 
     return reverse('ha:flatdetail') 

と私urls.py

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

私は、エラーを理解しますが、十分ではないがありますそれを処理するスキル。私はself.object.pkが写真のIDだがアパートではないことを訂正していますか? アパートのIDを取得できますか?

+0

@Pythonista、私は愚かなことをやろうとしています。 flat_idを 'photo_flat'に渡したいのであれば、' flat get_object_or_404(Flat) 'を' def get_initial(self) 'に含めるべきでしょうか?しかし、それは私が持っているフラットの全体のリストを返します。特定のIDをどのように渡すことができますか?このように: 'flat = get_object_or_404(Flat、pk = flat_id)'?しかし、 'get_initial'は' flat_id'を持たないので動作しません –

答えて

2

あなたはエラーを誤解していますが、それは部分的にはあなたがやっていることが意味をなさないからです。

self.objectは、このビューに関連するオブジェクトのみを参照できます。この場合は写真です。写真がまだ作成されていないので、あなたがget_initialをしたときにまだ存在しません。特定のFlatオブジェクトのIDを使用したいと思うようです。この場合、そのIDをビューに(URLを介して)渡す必要があります。 flat_ajaxビューでこれを既に実行しています。あなたはここで全く同じことをしなければなりません。そして、self.kwargs['flat_id']でIDを参照することができます。

get_initialは実際にこれを行うには最適な場所ではありません。 UserオブジェクトとFlatオブジェクトは、フォームに渡す値ではなく、最初にフィールドに値を設定してユーザーに変更させます。保存時に自動的にオブジェクトに関連付ける値です。あなたはこのようにそれを行う場合

def form_valid(self, form): 
    form.instance.photo_user = self.request.user 
    form.instance.photo_flat_id = self.kwargs['flat_id'] 
    return super(PhotoUploadView, self).form_valid(form) 

は、フォームに表示されるフィールドからphoto_userphoto_flatを削除する必要があります。the documentationに示すように、これは本当に、form_validで行う必要があります。

関連する問題