次のモデルがあります:Topic、UserProfile、UserSubscribeToTopic
これらの最後は次のようになります。
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()))
ただし、明らかに、これはユーザーが既に購読しているトピックのみを表示します。本当に必要なすべてのトピックを表示するには、Topic テーブルで LEFT JOIN を実行します。raw に頼らずに Django でこれを行う方法がわかりません。
私の質問:
- 左結合から生成されたフォームセットにクエリセットを指定することはできないと思いますか?
- ModelForm をあきらめて、手動で入力するフォームセットを使用する方がよいでしょうか?
- より良いアプローチはありますか?!