Вопрос по python – Как установить ForeignKey в CreateView?

40

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

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

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

Update:

Решение перенесено в отделениеответ ниже.

абсолютно лучшее решение! glarrain

Ваш Ответ

4   ответа
9

Я просто наткнулся на эту проблему, и эта тема привела меня в правильном направлении (спасибо!). На основеэта страница документации 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)
1

Вы должны создать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
Error: User Rate Limit Exceeded Vlad T.
Error: User Rate Limit ExceededrequestError: User Rate Limit Exceeded
Error: User Rate Limit Exceededstackoverflow.com/questions/907858/… Vlad T.
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededuserError: User Rate Limit Exceeded Vlad T.
34

Я решил это, переопределив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)
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededcommit=FalseError: User Rate Limit Exceededarticle.save()Error: User Rate Limit Exceededsuper(...)Error: User Rate Limit Exceededreturn redirect(self.get_success_url())Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededform_validError: User Rate Limit Exceededform.instance.author = self.request.user
Error: User Rate Limit ExceededsaveError: User Rate Limit ExceededsuperError: User Rate Limit Exceededself.objectError: User Rate Limit Exceededself.get_success_url().
Error: User Rate Limit Exceededform_validError: User Rate Limit ExceededsuperError: User Rate Limit ExceededsaveError: User Rate Limit Exceededsuccess_urlError: User Rate Limit Exceeded Vlad T.
2

Код Берислава в 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
        }
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededget_initialError: User Rate Limit Exceededs)
Error: User Rate Limit Exceeded

Похожие вопросы