Я создаю простой Ratemyteacher / Prof клон. Проблема в том, что когда я пытаюсь добавить объект Review
через мой взгляд, я получаю NOT NULL constraint failed: rate_review.review_id
(имя приложения - скорость). Работает нормально при добавлении через /admin
. Также добавление других моделей работает нормально.
Вот вид, где это происходит:
def add_review(request, teacher_id):
form = ReviewForm()
if request.method == 'POST':
form = ReviewForm(request.POST)
if form.is_valid():
ip = request.META.get('HTTP_CF_CONNECTING_IP')
if ip is None:
ip = request.META.get('REMOTE_ADDR')
form.customSave()
messages.success(request, 'Review added.')
else:
form = ReviewForm(request.POST)
return render(request, 'rate/add_review.html', {'form': form})
return render(request, 'rate/add_review.html', {'form': form})
Вот форма (усеченная для исключения load
s). Я использую this для визуализации форм:
<form method="POST">{% csrf_token %}
<div class="field">
<label class="label">Stars (whole numbers only)</label>
<div class="control">
{% render_field form.stars class+="input" %}
</div>
</div>
<div class="field">
<label class="label">Review subject</label>
<div class="control">
{% render_field form.subject class+="input" %}
</div>
</div>
<div class="field">
<label class="label">Review text</label>
<div class="control">
{% render_field form.text class+="textarea" placeholder="Review text" rows="10" %}
</div>
</div>
<div class="field">
<label class="label">Username</label>
<div class="control">
{% render_field form.author class+="input" placeholder="eg. ReviewerMan21, John Smith" %}
</div>
</div>
<button type="submit" class="button">Add review</button>
</form>
Мои модели.py:
class Teacher(models.Model):
grade = models.IntegerField()
name = models.CharField(max_length=35)
subject = models.CharField(max_length=50)
ip = models.CharField(max_length=14)
approved = models.BooleanField(null=True, blank=True)
class Review(models.Model):
teacher = models.ForeignKey(Teacher, on_delete=models.CASCADE)
text = models.TextField()
subject = models.CharField(max_length=120)
author = models.CharField(max_length=35)
ip = models.CharField(max_length=14)
date = models.DateTimeField(auto_now_add=True)
stars = models.PositiveSmallIntegerField()
Мои формы.py:
from django import forms
from .models import Teacher, Review, Grade
from django.core import validators
class ReviewForm(forms.ModelForm):
class Meta:
model = Review
fields = ('subject', 'text', 'stars', 'author')
def customSave(self, ip):
lv = self.save(commit=False)
lv.ip = ip
lv.save()
return lv
class TeacherForm(forms.ModelForm):
class Meta:
model = Teacher
fields = ('subject', 'name', 'grade')
def customSave(self, ip):
lv = self.save(commit=False)
lv.ip = ip
lv.save()
return lv
Вещи, которые я пробовал :
- Сброс / очистка БД
- Комментирование
ip
, author
& stars
- Добавление
blank=True, null=True
к ip
, stars
и author
- Перенос БД
Редактировать: я исправил (благодаря ответу ниже), изменив customSave
в ReviewForm
на это, а затем передав переменную teacher
из моего представления:
def customSave(self, ip, teacher):
lv = self.save(commit=False)
lv.ip = ip
lv.teacher = teacher
lv.save()
return lv