Получение «NOT NULL ограничение» при отправке формы через представление. Работает нормально при добавлении через / admin - PullRequest
0 голосов
/ 12 января 2019

Я создаю простой 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

1 Ответ

0 голосов
/ 12 января 2019

Ваша ошибка показывает, что review_id равно None (null). Я заметил, что ваше поле ForeignKey для Teacher в модели Review называется review вместо teacher, что указывает на то, что review_id действительно принадлежит объекту Teacher.

Я заметил, что в первой строке вашего метода add_review вы получаете объект Teacher, но никогда ничего с ним не делаете. Вы намеревались установить учителя (поле «обзор») в только что созданном отзыве на этот экземпляр учителя?

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