Подтвердить что ты не робот

Как установить ForeignKey в CreateView?

У меня есть модель:

class Article(models.Model):
    text = models.CharField()
    author = models.ForeignKey(User)

Как написать представление на основе класса, которое создает экземпляр новой модели и устанавливает внешний ключ author для request.user?

4b9b3361

Ответ 1

Я решил это, переопределив метод form_valid. Вот подробный стиль, чтобы прояснить ситуацию:

class CreateArticle(CreateView):
    model = Article

    def form_valid(self, form):
        article = form.save(commit=False)
        article.author = self.request.user
        #article.save()  # This is redundant, see comments.
        return super(CreateArticle, self).form_valid(form)

Но мы можем сделать это коротко (спасибо dowjones123), этот случай указан в документах.:

class CreateArticle(CreateView):
    model = Article

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateArticle, self).form_valid(form)

Ответ 2

Код Berislav в views.py не работает для меня. Форма отображается как ожидалось, с пользовательским значением в скрытом вводе, но форма не сохраняется (я не знаю почему). Я попробовал несколько иной подход, который работает для меня:

views.py

from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article

class NewArticleView(CreateView):
    model = Article
    form_class = ArticleForm
    def get_initial(self):
        return {
            "user": self.request.user
        }

Ответ 3

Я просто наткнулся на эту проблему, и эта нить привела меня в правильном направлении (спасибо!). Основываясь на этой странице документации Django, мы можем вообще не обращаться к методу формы save():

class CreateArticle(LoginRequiredMixin, CreateView):
    model = Article

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super(CreateArticle, self).form_valid(form)

Ответ 4

Вы должны настроить CreateView с помощью ModelForm для этой модели. В определении формы вы установите для ForeignKey виджет HiddenInput, а затем используйте метод get_form в представлении, чтобы установить значение вашего пользователя:

forms.py:

from django import forms

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        widgets = {"user": forms.HiddenInput()}

views.py:

from django.views.generic import *
from myapp.forms import ArticleForm
from myapp.models import Article

class NewArticleView(CreateView):
    model = Article
    form_class = ArticleForm
    def get_form(self, form_class):
        initials = {
            "user": self.request.user
        }
        form = form_class(initial=initials)
        return form