Иностранный ключ пользователя Django, save_model и save_formset - PullRequest
1 голос
/ 30 марта 2011

У меня есть несколько вещей о сохранении вошедшего в систему пользователя, save_model () и save_formset () из модели Admin Джанго, о котором я хотел бы спросить.

Учтите, что у меня есть модель, которая делает фотографию, которую пользователь загружает через http POST.

In models.py:

class photo(models.Model):
    title = models.CharField(max_length=50)
    img = models.ImageField(upload_to='photocollection')
    uploader = models.ForeignKey(User)
    latitude =  models.FloatField(null=True, blank=True)
    longitude = models.FloatField(null=True, blank=True)

    def save(self):
        #Retain the model instance to do some processing before saving:
        self.latitude = exif.getGPSLatitude(self.img)
        self.longitude = exif.GPSLongitude(self.img)
        return super(photoCollection, self).save()

class photoForm(ModelForm):
    class Meta:
        model = photo

Тогда в моих взглядах. Py:

def upload(request):
    form = photoForm(request.POST, request.FILES)

    if form_is_valid():
       #do something useful
       form.save()

Здесь у меня интересный сценарий. Форма в my views.py недопустима, так как поле ['uploader'] в моделях никогда не обновляется, и это обязательное поле, поэтому оно не будет сохранено.

1) Как получить форму для проверки?

Также при сохранении формы я видел сообщение здесь , в котором рассказывается, как сохранить ForeignKey (Пользователь) с помощью save_model () в modelAdmin. Я попытался переопределить это, как показано в ссылке, создав класс photoAdmin в моем admin.py:

class photoAdmin(admin.ModelAdmin):
   def save_model(self, request, obj, form, change):
       if not change:
           obj.uploader = request.user
       obj.save()

но он все еще не может сохранить поле загрузчика с request.user или request.user.username. Я также попытался переопределить save_formset (), так как я использую photoForm в моем views.py. По-прежнему безрезультатно.

2) Когда на самом деле вызываются save_model () и save_formset ()?

3) В чем разница между save_formset () и save_model ()?

4) Будут ли вызваны save_model () или save_formset (), когда я просто вызову form.save () в views.py выше?

5) Что плохого в моем подходе как в проверке формы в views.py, так и в сохранении поля загрузчика с request.user, и как мне это исправить? Некоторые примеры кодов будут очень полезны.

Я прочитал документы Django на Административный сайт , но они не совсем отвечают на мои вопросы. Любое просветление будет с благодарностью.

1 Ответ

7 голосов
/ 30 марта 2011

Давайте разберемся с вашим первым вопросом о вашем взгляде.Как вы говорите, это недопустимая форма, потому что загрузчик не поставляется.Исключите пользовательское поле из ModelForm с атрибутом exclude Meta class (поскольку мы планируем его автоматически вставить).

class photoForm(ModelForm):
    class Meta:
        model = photo
        exclude= ('uploader',)

if form_is_valid(): # uploader has been excluded. No more error.
    photo = form.save(commit=False) # returns unsaved instance
    photo.uploader = request.user
    photo.save() # real save to DB.

Ваш второй вопрос о ModelAdmin:

Нет, save_model() - это метод ModelAdmin, он не имеет ничего общего с вашим form в вашем views.py.save_model вызывается на ModelAdmin, когда ModelForm для редактируемого объекта подтвержден.

Ваш код для ModelAdmin должен работать так, как он есть у вас, если только в вашей форме не было ошибок.Вам нужно будет сообщить мне, какие ошибки вы получили, если вам нужен дальнейший совет!


2) Когда на самом деле вызываются save_model () и save_formset ()?

После проверки форм и наборов форм.

3) В чем разница между save_formset () и save_model ()?

save_model для редактируемой модели, то есть для какой модели вы зарегистрировали свой ModelAdmin в

save_formset предназначен для сохранения наборов форм (ModelAdmin.inlines)

4) Будут ли вызваны save_model () или save_formset (), когда я просто вызову form.save () вviews.py выше?

Нет, с чего бы это им?Они совершенно не связаны с вашими views.py формами.save_model () - это метод ModelAdmin, а не метод Form.

5) Что плохого в моем подходе как при проверке формы в views.py, так и при сохранении поля загрузчикас request.user, и как мне это исправить?Некоторые примеры кодов будут очень полезны.

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

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...