Как передать объект пользователя в Modelform с помощью CreateView - PullRequest
0 голосов
/ 08 февраля 2019

Сбой ограничения NOT NULL: blog_post.author_id

Привет, я новичок в django и не могу исправить эту ошибку.

Я строюприложение блога, и я хочу, чтобы автор был текущим пользователем.
Я знаю, что не передаю объект пользователя в форму должным образом, но ни одно из найденных решений не сработало для меня.

Заранее спасибо!

models.py

class User(auth.models.User,auth.models.PermissionsMixin):
    def __str__(self):
        return '@{}'.format(self.username)


class Post(models.Model):
    author = models.OneToOneField(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()

def get_absolute_url(self):
    return reverse('post_detail',kwargs={'pk':self.pk})

forms.py

class UserForm(UserCreationForm):
    class Meta:
        fields = ('username', 'email', 'password1', 'password2')
        model = get_user_model()

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)


 class PostForm(forms.ModelForm):
     class Meta:
         model = Post
         fields = ('title', 'text',)

views.py

class SignUpView(CreateView):
    form_class = UserForm
    success_url = reverse_lazy('login')
    template_name = 'registration/signup.html'

class PostCreateView(LoginRequiredMixin, CreateView):
    login_url = '/login/'
    redirect_field_name = 'blog/post_detail.html'

    form_class = PostForm
    model = Post

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Я нашел решение, которое сработало в моем случае и очень похоже на ваши @ Silas.

views.py

class PostCreateView(LoginRequiredMixin, CreateView):
    login_url = '/login/'
    redirect_field_name = 'blog/post_detail.html'
    form_class = PostForm
    model = Post

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.author = self.request.user
        self.object.save()
        return super().form_valid(form)

моделей.py

class Post(models.Model):
author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
...
0 голосов
/ 08 февраля 2019

Ваш код хорош, за исключением того, что вы не передаете объект User для обновления поля автора.

Я думаю, что в вашем PostCreateView вы можете сделать что-то вроде этого:

class PostCreateView(LoginRequiredMixin, CreateView):
     login_url = '/login/'
     redirect_field_name = 'blog/post_detail.html'
     form_class = PostForm
     model = Post

     def valid_form(self,form, **kwargs):
         form.instance.author = self.request.user
         super(PosetCreateView, self).get_context_data(kwargs)

         return HttpResponse('/')
...