Django3.0 добавить request.user для формирования запроса - PullRequest
0 голосов
/ 29 апреля 2020

Допустим, у нас есть эта модель:

class Creation(models.Model):
    title = models.CharField(max_length=DEFAULT_LENGTH)
    url = models.CharField(max_length=DEFAULT_LENGTH)    
    date = models.DateTimeField('date published', default=datetime.date.today)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)

    def __str__(self):
        return self.title

И давайте использовать это представление:

def submit(request):
    FormSet = modelformset_factory(Creation, fields=('title', 'url'))
    if request.method == 'POST':
        formset = FormSet(request.POST, request.FILES)
        if formset.is_valid():
           obj = formset.save(commit=False)
            obj.author = request.user
            obj.save()
    else:
        formset = FormSet
    return render(request, 'app/submit.html', {'formset': formset})

I сохранено formset до obj и добавил request.user и зафиксировал его в базе данных. Это не работает, потому что теперь django выдает ошибку, которая говорит, что

объект 'list' не имеет атрибута 'author'

, что вполне логично, потому что в списке полей нет author. Но , если я добавлю 'author' к fields, при отображении шаблона с помощью {{formset}} будет отображаться еще одно окно выбора. Возможно, я мог бы написать свой собственный шаблон-код вместо использования {{formset}} и опустить автора, но я чувствую, что с Django3.0 должен быть более элегантный способ. Есть ли что-нибудь?

Все, что я хочу сделать, это заполнить посторонний ключ author (см. Модель выше) зарегистрированным пользователем.

1 Ответ

0 голосов
/ 30 апреля 2020

Оказывается, что-то не так с modelformset_factory(..).

Если вы используете CreationForm в models.py:

class CreationForm(ModelForm):
    class Meta:
        model = Creation
        fields = ['title', 'url']

и используете его в вашем views.py:

formset = CreationForm(request.POST)
    if request.method == 'POST':
        if formset.is_valid():
            f = formset.save(commit=False)
            f.author = request.user
            f.save()

, это работает.

...