我有以下模型:Topic、UserProfile、UserSubscribedToTopic
最后一个看起来像这样:
class UserSubscribedToTopic(models.Model):
topic = models.ForeignKey(Topic)
user_profile = models.ForeignKey(UserProfile)
start_date = models.DateField(null=True, blank=True)
我想向用户显示一个主题列表,每个主题都有一个复选框。如果用户选中一个复选框,那么我将使用 JavaScript 来显示“开始日期”文本字段(因此出于这个问题的目的,我只需要在复选框旁边显示一个文本字段)。如果用户已经保存了他们的选择并且正在重新访问页面,我想在表单首次呈现时相应地填充表单。
我尝试使用表单集来做到这一点:
class SubscribeToTopicForm(ModelForm):
class Meta:
model = UserSubscribedToTopic
fields = ('topic','start_date')
widgets = {'topic': CheckboxInput(attrs={'class': 'topic-checkbox'}),
'start_date': TextInput(attrs={'class': 'date','placeholder': 'Start date'})}
SubscribeToTopicFormSetBase = modelformset_factory(
UserSubscribedToTopic,
form=SubscribeToTopicForm,
extra = 0)
class SubscribeToTopicFormSet(SubscribeToTopicFormSetBase):
def add_fields(self, form, index):
super(SubscribeToTopicFormSet, self).add_fields(form, index)
如果我将以下内容添加到我的视图中,我几乎得到了我想要的东西:
topics_formset = SubscribeToTopicFormSet(queryset=UserSubscribedToTopic.objects.filter(user_profile=user.get_profile()))
但是,显然这只会显示用户已经订阅的主题。要显示我真正需要做的所有主题是在主题表上的左连接。如果不求助于 raw,我看不到如何在 Django 中执行此操作。
我的问题:
- 我是否认为不可能为从左连接生成的表单集指定查询集?
- 放弃 ModelForm 并使用我手动填充的表单集会更好吗?
- 有更好的方法吗?!