/answer/ NOT NULL 约束的 IntegrityError 失败:answer_answer.post_id

IntegrityError at /answer/ NOT NULL constraint failed: answer_answer.post_id

当我提交 answer 时,我有 2 个模型,一个用于 Question,一个用于 Answer形成它向我抛出这样的错误:IntegrityError at /answer/ NOT NULL 约束失败:answer_answer.post_id 我正在尝试通过添加 blank=Falsenull=False[=34= 来修复它] 并删除了我的迁移,但错误仍然存​​在。请问如何解决这个问题。

我希望用户能够 post 回答单个问题错误来自我的 My_Answer 视图,它突出显示了这一行代码:

return super (My_Answer,self).form_valid(form)

我的模特

class Question(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=100, blank=False, null=False)
    body = RichTextField(blank=False, null=False) 
    category = models.CharField(max_length=50, blank=False, null=False)

    def __str__(self):
        return str(self.user)

class Answer(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    answer = RichTextField(blank=False, null=False)
    post = models.ForeignKey(Question, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.user)

观看次数

def viewQuestion(request, pk):
    question = Question.objects.get(id=pk)
    answers = Answer.objects.filter(post_id=question)
    context = {'question':question, 'answers':answers}
    return render(request, 'viewQuestion.html', context)


class My_Question(LoginRequiredMixin, CreateView):
     model = Question
     fields = ['title', 'body', 'category']
     template_name = 'question.html'
     success_url = reverse_lazy('index')

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

class My_Answer(LoginRequiredMixin, CreateView):
    model = Answer
    fields = ['answer']
    template_name = 'answer.html'
    success_url = reverse_lazy('index')

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

viewQuestion 模板:

<div class="container">
    <div class="row justify-content-center">
        <h1>{{question.title}}</h1>
        <hr>
    </div>
    <br>
    <h3 style="font-family: arial;">{{question.body|safe}}</h3>
    <hr>
    <br>
    <h5>{{question.user.username.upper}}</h5>
</div>
<!--question-->
<div class="container">
    <div class="row justify-content-center">
        <a href="{% url 'answer' %}" class="btn btn-primary">Post Your Answer</a>
    </div>
</div>
<br>
<br>
<!--answer-->
<div class="container">
    {% for answer in answers reversed %}
    <div class="row justify-content-center">
        <p>{{answer.user}}</p>
        <p>{{answer.answer|safe}}</p>
    </div>
    {% endfor %}
</div>

感谢您的帮助。

您正在保存一个答案实例,其中只有来自表单的答案和来自请求用户的用户,但是 post ID 在哪里,它不能是 none 并且是必需的。

你 url 模式应该是这样的

urlpatterns = [
    path('question/<int:pk>/', viewQuestion, name='view-question'),
    path('question/<int:pk>/answer/', My_Answer.as_view(), name='answer'),
]

您只需将 viewQuestion.html 中的 url 更改为

<div class="row justify-content-center">
    <a href="{% url 'answer' pk=question.pk %}" class="btn btn-primary">Post Your Answer</a>
</div>

并且在回答中的观点是

def form_valid(self, form):
    form.instance.user = self.request.user
    form.instance.post_id = self.kwargs['pk']
    return super (My_Answer, self).form_valid(form)

所以基本上你是在没有 post pk 的情况下保存答案实例,我在 url 参数中传递了 post pk 并得到答案 post 视图以保存在表单实例中.现在应该可以使用了!