NOT NULL约束失败,Django CreateView失败

用户名

我想在这个项目上实现两个目标。首先,我想将登录用户另存为审阅者。其次,我想将外键中的律师价值传递给复查表。(通过这种方式,用户可以查看单击律师详细信息页面上的查看链接,然后查看该律师,而没有其他人。)

我不断犯错,这是我的第一个目标。

错误

IntegrityError at /lawyers/karlyn-rosemarie-hylton/review/
NOT NULL constraint failed: lawyers_review.reviewer_id

有人可以解释我在做什么错以及如何解决吗?

第二个目标似乎与第一个目标非常相关。我没有任何错误。但我想确保自己做得对。但是,直到我通过第一个错误,我才能告诉。

非常感谢任何帮助。

models.py

from django.db import models
from django.urls import reverse
from django.template.defaultfilters import slugify
from django.contrib.auth.models import User


class Lawyer(models.Model):
    name = models.CharField(max_length=55,
                            default='')
    picture = models.ImageField(upload_to='media/lawyers/pictures', 
                                default='')
    slug = models.SlugField()

    def average_rating(self):
        all_ratings = map(lambda x: x.rating, self.review_set.all())
        return np.mean(all_ratings)

    def save(self, *args, **kwargs):
        self.slug = (slugify(self.name))
        super(Lawyer, self).save(*args, **kwargs)

    def get_absolute_url(self):
        return reverse('lawyers:detail', kwargs={'slug': self.slug})

    def __str__(self):
        return self.name 


class Review(models.Model):
    RATING_CHOICES = (
        (1, '1'),
        (2, '2'),
        (3, '3'),
        (4, '4'),
        (5, '5'),
    )
    lawyer = models.ForeignKey(Lawyer, 
                                null=True)
    created = models.DateTimeField(auto_now_add=True)
    reviewer = models.ForeignKey(User)
    title = models.CharField(max_length=55,
                                default='')
    comment = models.TextField()
    rating = models.IntegerField(choices=RATING_CHOICES)

    def __str__(self):
        return self.lawyer.name

views.py

from django.shortcuts import render, get_object_or_404
from django.views.generic import (CreateView,
                                    DetailView,
                                    ListView)


from django.contrib.auth.models import User


from .models import Lawyer, Review


class AddLawyerView(CreateView):
    model = Lawyer 
    fields = ['name', 'picture']

    def post_valid(self, form):
        lawyer = form.save(Commit=False)
        lawyer.picture = form.cleaned_data['picture']
        return super(AddLawyerView, self).form_valid(form)


class LawyerDetail(DetailView):
    model = Lawyer 


class LawyerList(ListView):
    model = Lawyer 


class AddReviewView(CreateView):
    model = Review 
    fields = ['rating', 'title', 'comment']

    def post_valid(self, form):
        review = form.save(Commit=False)
        review.lawyer = get_object_or_404(Lawyer, 
                                            slug=self.kwargs.get('slug'))
        review.reviewer = User.objects.get(user=self.request.user)
        return super(AddReview, self).form_valid(form)

urls.py

from django.conf.urls import url


from .views import (AddLawyerView, 
                    LawyerDetail,
                    LawyerList,
                    AddReviewView)


urlpatterns = [
    url(r'^add-lawyer',
        AddLawyerView.as_view(),
        name = 'add-lawyer'),


    url(r'^(?P<slug>[\w-]+)/$',
        LawyerDetail.as_view(),
        name = 'detail'),


    url(r'^$',
        LawyerList.as_view(),
        name = 'list'),


    url(r'^(?P<slug>[\w-]+)/review/$',
        AddReviewView.as_view(),
        name = 'add-review'),
]

利用@Alasdair和@Sachin Kukreja的反馈,我返回并进行了一些更正。我将“提交”更改为“提交”,将“ post_valid”更改为“ form_valid”。我还做了一个小调整,以简化视图。纠正和正常工作的AddReviewView如下。上面有一个错误。

谢谢你们!

工作视图:

class AddReviewView(CreateView):
    model = Review 
    fields = ['rating', 'title', 'comment']

    def form_valid(self, form):
        review = form.save(commit=False)
        review.lawyer = get_object_or_404(Lawyer, 
                                            slug=self.kwargs.get('slug'))
        review.reviewer = self.request.user
        return super(AddReviewView, self).form_valid(form)
萨钦

您在那里有错别字,您处于压倒性状态,form_valid但是您已经写了post_valid

def form_valid(self, form):
    review = form.save(Commit=False)
    review.lawyer = get_object_or_404(Lawyer, 
                                        slug=self.kwargs.get('slug'))
    review.reviewer = User.objects.get(user=self.request.user)

    # save and return HttpResponse
    review.save()
    return HttpResponseRedirect(self.get_success_url())

但是,该super调用仍将调用父类,form_valid这仍然会引发错误。我认为您可以将评论保存在此重写的方法中,并返回基类返回的内容,即return HttpResponseRedirect(self.get_success_url())

参考:FormMixin类中的form_valid,ModelFormMixin类中的form_valid

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章