通过视图提交表单时获取“非空约束”。通过/admin添加时工作正常

2024-04-23 08:01:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个简单的ratemyteacher/prof克隆。问题是,当试图通过我的视图添加Review对象时,我得到了NOT NULL constraint failed: rate_review.review_id(应用程序名是rate)。当通过/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)。我使用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>

My models.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()

My forms.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

我尝试过的事情

  • 重置/刷新数据库
  • 评出{}、{}&stars
  • 添加blank=True, null=Trueipstarsauthor
  • 迁移数据库

编辑:通过将ReviewForm中的customSave更改为this,然后从我的视图中传递teacher变量,我已经修复了(感谢下面的答案):

    def customSave(self, ip, teacher):
        lv = self.save(commit=False)
        lv.ip = ip
        lv.teacher = teacher
        lv.save()
        return lv

Tags: ipdivformfieldmodelsrequestrenderreview
1条回答
网友
1楼 · 发布于 2024-04-23 08:01:14

您的错误显示review_idNonenull)。我注意到Review模型上Teacher的ForeignKey字段名为review,而不是teacher,这表明review_id确实属于Teacher对象

我注意到您的viewadd_review方法的第一行,您得到了一个Teacher对象,但从未对它做过任何事情。您是否打算将新创建的审阅中的教师(“审阅”字段)设置为此教师实例

相关问题 更多 >