У меня есть 2 модели, одна для Вопрос и одна для Отвечать, когда я отправил форму отвечать, она выдает мне такую ошибку: IntegrityError в /answer/ Ошибка ограничения NOT NULL: answer_answer.post_id Я пытаюсь исправить это, добавив пустой = Ложь и ноль = ложь и удалив свои миграции, но ошибка все еще есть. Как я могу решить эту проблему, пожалуйста.
Я хочу, чтобы пользователь мог опубликовать ответ на один вопрос, ошибка возникает из моего представления Мой ответ, и она выделяет эту строку кода:
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>
Спасибо за помощь.
Нет, посмотрите на мое представление ViewQuestion. Вы можете увидеть переменную ответы = Answer.objects.filter(post_id=вопрос)
Вы сохраняете экземпляр ответа только с ответом из формы и пользователем из пользователя запроса, но где находится идентификатор сообщения, который не может быть пустым и требуется.
ваши шаблоны URL должны выглядеть так
urlpatterns = [
path('question/<int:pk>/', viewQuestion, name='view-question'),
path('question/<int:pk>/answer/', My_Answer.as_view(), name='answer'),
]
Вам нужно только изменить URL-адрес в viewQuestion.html как
<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)
Таким образом, в основном вы сохраняете экземпляр ответа без сообщения pk, я передал сообщение pk в параметрах URL-адреса и получил представление сообщения ответа, чтобы сохранить его в экземпляре формы. Это должно работать сейчас!
Как я могу это сделать, пожалуйста? Можете ли вы отредактировать свой ответ, пожалуйста
у вас есть идентификатор сообщения в параметрах URL?
Нет, <a href = "{% url 'answer' %}" class = "btn btn-primary">Опубликуйте свой ответ</a>
Это мой URL-адрес, я не включил в него идентификатор.
Я редактирую ответ для вас
Хорошо, сэр, я буду ждать вашего редактирования. Большое спасибо
Не волнуйтесь! Это решило вашу проблему?
Нет, это говорит kwargs не определен, затем я добавил его в свой: def form_valid (я, форма, ** kwargs):, ошибка исчезла, но он также выдает ошибку, подобную этой, сэр: KeyError в /question/1/answer/ 'pk', поэтому я добавил pk, как этот def form_valid (я, форма, pk, **kwargs):, он также выдает такую ошибку: My_Answer.form_valid() отсутствует 1 обязательный позиционный аргумент: 'pk'
как я могу решить эту проблему, сэр?
просто делай, как я сказал. Я протестировал код, и он работал нормально. Вы изменили URL-ссылку в viewQuestion.html?
вау, это работает, когда я удалил все из своей базы данных и повторил попытку. Большое спасибо за полезный ответ. Я горжусь тобой. ты спасаешь мои дни.
Я думаю, что вы не назначаете сообщение ответу при создании ответа, поэтому он выдает ошибку целостности post_id.