0

Изучаю CBV в джанго. Я хочу, чтобы пользователь мог загружать изображения на определенную карту квартиры. Так Модель была создана:Django. Получить id объекта ForeignKey в CreateView

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. Когда я пытаюсь сохранить одну или несколько фотографий через форму на странице, у меня есть AttributeError.

'NoneType' object has no attribute 'pk' 

Мои ModelForm выглядит следующим образом:

class PhotoUploadModelForm(forms.ModelForm): 

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

Мой CreateView:

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 будет идентификатором изображения, но не квартирой? Могу ли я получить идентификатор квартиры?

+0

@Pythonista, я думаю, что я пытаюсь сделать что-то глупое, Если я хочу передать flat.id на 'photo_flat', возможно, я должен включить' flat = get_object_or_404 (Flat) 'в' def get_initial (self) '? Но он возвращает весь список квартир, которые у меня есть. Как я могу передать определенный идентификатор? Например: 'flat = get_object_or_404 (Flat, pk = flat_id)'? Но это не работает, потому что 'get_initial' не имеет' flat_id' –

ответ

2

Вы неправильно интерпретируете ошибку, но это отчасти потому, что то, что вы делаете, не имеет большого смысла.

self.object может относиться только к объекту, с которым связано это представление, что в данном случае является Photo; но, конечно, фото еще не существует, когда вы делаете get_initial, потому что он не был создан. Кажется, что вы хотите использовать ID конкретного Flat-объекта; в этом случае вам нужно будет передать этот идентификатор в представление, то есть через URL-адрес. Вы делаете это уже в своем представлении flat_ajax; вы должны сделать то же самое здесь, и тогда вы сможете ссылаться на ID через self.kwargs['flat_id'].

Обратите внимание, что get_initial на самом деле не лучшее место для этого, во всяком случае. Объект User и Flat не являются значениями, которые вы хотите передать в форму, чтобы они сначала заполняли поля, но позволяли пользователю изменять их; это значения, которые вы хотите автоматически связать с объектом при сохранении. Таким образом, это действительно должно быть сделано в form_valid, как показано на the documentation:

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_user и photo_flat из полей, перечисленных в форме.