【问题标题】:Django - form_valid() variable undefinedDjango - form_valid() 变量未定义
【发布时间】:2019-09-11 06:29:51
【问题描述】:

我需要获取尝试创建评论以存储在模型中的用户的 profile_id。我可以获取用户的属性,因为它们内置在 django 中,但是当我尝试使用下面的内容获取 profile_id 时,我得到“prof is not defined”错误。

views.py

    class ReviewCreateView(LoginRequiredMixin, CreateView):
      model = Review
      fields = ['rating', 'reviewtext']
      def get_context_data(self, **kwargs):
        context = super(ReviewCreateView, self).get_context_data(**kwargs)
        context['prof'] = Profile.objects.values_list('id', flat=True).filter(user_id=self.request.user.id)
        return context
      def form_valid(self, form):
        form.instance.product = self.request.GET.get('pk')
        form.instance.author = self.request.user
        form.instance.profile = prof
        return super().form_valid(form)

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete = models.CASCADE)

class Review(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    rating = models.PositiveSmallIntegerField(default=1, validators = [MinValueValidator(1), MaxValueValidator(5)])
    reviewtext = models.TextField()

class Product(models.Model):
    name = models.CharField(max_length=100)

【问题讨论】:

  • prof 没有在该函数的任何地方定义。您希望它来自哪里?
  • 拥有指向用户和个人资料的单独链接有什么意义?这些模型已关联。
  • @DanielRoseman 因为个人资料有我在其他地方使用的字段,所以我只显示与我的问题相关的字段。
  • @JohnGordon 我正在尝试从 get_context_data 获取它
  • 您仍然可以从self.request.user.profile 获得它。但正如我所说,没有理由这样做。然而,你试图做的事情有很多问题:你没有打电话给get_context_data;如果你有,你会得到一个字典,而不是一个属性;出于某种原因,该字典的 prof 键是值列表,而不是 Profile 对象。

标签: python django django-rest-framework django-forms django-templates


【解决方案1】:

配置文件通过外键链接到用户,所以我可以写下面的行,在我添加 self.kwargs 行之前,product_id 也得到了一个空约束。

def form_valid(self, form, **kwargs):
    form.instance.product_id = self.kwargs['pk']
    form.instance.author = self.request.user
    form.instance.profile = self.request.user.profile
    return super().form_valid(form)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2013-05-12
    • 2016-08-17
    • 2020-08-08
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 2021-02-27
    相关资源
    最近更新 更多