基于 Django class 的视图 - 过滤查询集并保存
Django class based views - Filter queryset and save it
我有两个名为 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 的视图来更新我的对象,就像这样:
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 工作得很好。唯一的问题是我必须更改我的表单并在呈现之前过滤我的 "sponsor" 查询集!那是因为用户只能看到自己创建的"sponsors"。
所以,这就是我要实现的目标:
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)
我的观点是正确的,只有用户创建的赞助商,但是,当我尝试保存时,我得到这个错误:
"Cannot assign "u'2'": "Event.sponsor" must be a "Sponsor" instance."
我该怎么办?我不知道如何解决这个问题......我在这里遵循正确的逻辑吗?谢谢!
你走在正确的轨道上。尝试这样的事情:
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)
我有两个名为 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 的视图来更新我的对象,就像这样:
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 工作得很好。唯一的问题是我必须更改我的表单并在呈现之前过滤我的 "sponsor" 查询集!那是因为用户只能看到自己创建的"sponsors"。
所以,这就是我要实现的目标:
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)
我的观点是正确的,只有用户创建的赞助商,但是,当我尝试保存时,我得到这个错误:
"Cannot assign "u'2'": "Event.sponsor" must be a "Sponsor" instance."
我该怎么办?我不知道如何解决这个问题......我在这里遵循正确的逻辑吗?谢谢!
你走在正确的轨道上。尝试这样的事情:
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)