Модель комментариев только для пользователя django (1048, «Столбец 'user_id' не может быть пустым» или пользователь не заполнен) - PullRequest
2 голосов
/ 01 августа 2020

Надеюсь, у вас все хорошо.

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

I. Я начал с этой модели, но получил ошибку (1048, «Столбец 'user_id' не может быть нулевым») : models.py

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments")
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    publishing_date = models.DateField(auto_now_add=True)
     
    def __str__(self):
        return self.post.title

views.py

class PostDetail(generic.DetailView,FormMixin):
    model = Post
    context_object_name = 'post'
    template_name = 'post_detail.html'
    form_class = CreateCommentForm
    
    def get_context_data(self, **kwargs):
        context = super(PostDetail, self).get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def form_valid(self, form):
        if form.is_valid():
            form.instance.post = self.object
            form.save()
            return super(PostDetail, self).form_valid(form)
        else:
            return super(PostDetail, self).form_invalid(form)

    def post(self,*args,**kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_valid(form)

    def get_success_url(self):
        return reverse('post_detail',kwargs={"slug":self.object.slug})

forms.py

class CreateCommentForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        super(CreateCommentForm, self).__init__(*args,**kwargs)
        self.helper = FormHelper()
        self.helper.form_method="post"
        self.helper.layout = Layout(
            Field("content",css_class="form-control",style="margin-bottom:10px",rows="1"),
        )
        
        self.helper.add_input(Submit('submit','Comment',css_class="btn btn-sm",style="background-color: #0d6ec5;border-color: #0d6ec5;"))



    class Meta:
        model = Comment
        fields = [
            'content'
        ]

II. Он работал с моей панели администратора, но не с моего веб-сайта (я получил эту ошибку: (1048, «Столбец« user_id »не может быть нулевым»)). Поэтому я решил изменить свои модели на:

class Comment(models.Model):
    post = models.ForeignKey(Post,on_delete=models.CASCADE,related_name="comments")
    user = models.ForeignKey(User, blank=True, null=True, on_delete=models.CASCADE)
    content = models.TextField(max_length=160)
    publishing_date = models.DateField(auto_now_add=True)
     
    def __str__(self):
        return self.post.title

Дело в том, что если пользователь публикует комментарий, содержимое в порядке, но нет пользователя, связанного с комментарием. У кого-нибудь есть идея?

1 Ответ

1 голос
/ 01 августа 2020

Вам необходимо указать атрибут .user, вероятно, авторизованному пользователю:

from django.contrib.auth.mixins import LoginRequiredMixin

class PostDetail(LoginRequiredMixin, FormMixin, generic.DetailView):
    model = Post
    context_object_name = 'post'
    template_name = 'post_detail.html'
    form_class = CreateCommentForm
    
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['form'] = self.get_form()
        return context

    def form_valid(self, form):
        form.instance.post = self.object
        form<b>.instance.user = self.request.user</b>
        return super().form_valid(form)

    def post(self,*args,**kwargs):
        self.object = self.get_object()
        form = self.get_form()
        if form.is_valid():
            return self.form_valid(form)
        else:
            return self.form_valid(form)

    def get_success_url(self):
        return reverse('post_detail',kwargs={"slug":self.object.slug})

Примечание : вы можете ограничить представления представлением на основе классов для аутентифицированных пользователей с помощью LoginRequiredMixin mixin [Django -doc] .

Примечание : обычно лучше использовать settings.AUTH_USER_MODEL [Django -doc] для обращения к пользователю модель, чем использовать модель User [Django -doc] напрямую. Для получения дополнительной информации вы можете увидеть со ссылкой на User модель раздел документации .

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