【问题标题】:Django class based views - Filter queryset and save it基于 Django 类的视图 - 过滤查询集并保存它
【发布时间】:2016-08-27 19:38:29
【问题描述】:

我有两个名为 Sponsor 和 Event 的模型,它们是这样的:

class Sponsor(models.Model):

    name = models.CharField(max_length=200)
    user = models.ForeignKey(User)


class Event(models.Model):

    name = models.CharField(max_length=200)
    sponsor = models.ForeignKey(Sponsor)

然后,我使用基于类的视图来更新我的对象,就像这样:

class EventUpdate(UpdateView):
    model = Event
    form_class = EventForm
    success_url = reverse_lazy('dashboard_events')

    def get_form_kwargs(self):
        kwargs = super(EventUpdate, self).get_form_kwargs()
        kwargs.update({'user': self.request.user})
        return kwargs

到目前为止一切都很好!如果我不更改我的 EventForm,我的 UpdateView 工作得很好。唯一的问题是我必须在渲染之前更改我的表单并过滤我的“赞助商”查询集!那是因为用户只能看到他创建的“赞助商”。

所以,这就是我想要实现的目标:

class EventForm(ModelForm):    
...
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')
        super(EventForm, self).__init__(*args, **kwargs)
        choices = Sponsor.objects.filter(user=self.user).values_list('pk', 'name')
        self.fields['sponsor'] = forms.ChoiceField(choices=choices)

我的观点是正确的,只有用户创建的赞助商,但是,当我尝试保存时,我得到了这个错误:

“无法分配“u'2'”:“Event.sponsor”必须是“Sponsor”实例。”

我该怎么办?我不知道如何解决这个问题......我在这里遵循正确的逻辑吗?谢谢!

【问题讨论】:

    标签: django django-models django-forms django-views django-queryset


    【解决方案1】:

    你在正确的轨道上。试试这样的:

    class EventForm(ModelForm):    
    ...
        def __init__(self, *args, **kwargs):
            self.user = kwargs.pop('user')
            super(EventForm, self).__init__(*args, **kwargs)
            self.fields['sponsor'].queryset = Sponsor.objects.filter(user=self.user)
    

    【讨论】:

      猜你喜欢
      • 2016-11-22
      • 1970-01-01
      • 2015-11-04
      • 2017-10-18
      • 2018-11-19
      • 2020-10-22
      • 2019-07-31
      • 1970-01-01
      • 2018-03-22
      相关资源
      最近更新 更多