2012-04-26 21 views
0

に参加し、左を使用してフォームセットユーザーごとにチェックボックスが表示されます。ユーザーがチェックボックスをチェックすると、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) 

私は私の見解に以下を追加した場合、私はほとんど私が欲しいものを得る:

しかし、明らかにこれはのみ表示されますユーザーがすでに購読しているトピック本当に必要なトピックをすべて表示するには、トピックテーブルのLEFT JOINが必要です。私は生長に頼らずにDjangoでこれを行う方法を見ることができません。

私の質問:

  • は左から生成される フォームセットは、参加のために、私は右のそれを考えでクエリセットを指定することはできませんでしょうか?
  • ModelFormをあきらめて、手動で入力するフォームセットを使用する方が良いでしょうか?
  • これ以上のアプローチはありますか?

答えて

0

日付フィールドからチェックボックスを区切ってしまったので、フォームと手動で作成したフォームセットでforms.ModelMultipleChoiceFieldを使用して日付フィールドを処理することができました。

ここでコードがあります:

フォーム:

class SubscribedToTopicForm(ModelForm): 
    subscribed_to_topic = forms.ModelMultipleChoiceField(required=False,queryset=Topic.available_topics, widget=forms.CheckboxSelectMultiple(attrs={'class': 'topic-checkbox'})) 
    class Meta: 
    model = UserProfile 
    fields = ("subscribed_to_topic",) 

    def get_checked_topics(self): 
     return self.cleaned_data['subscribed_to_topic'] 

class StartDateForm(forms.Form): 
    topic_id = forms.CharField(widget=forms.HiddenInput,required=False) 
    start_date = forms.DateField(required=False,label='') 

StartDateFormSetBase = formset_factory(form=StartDateForm,extra = 0) 

class StartDateFormSet(StartDateFormSetBase): 
    def get_start_date(self, topic_id): 
     for i in range(0, self.total_form_count()): 
      form = self.forms[i] 
      form_topic_id=long(form.cleaned_data['topic_id']) 
      if topic_id == form_topic_id: 
       return form.cleaned_data['start_date'] 
     return '' 

ビュー:

GET:

topics_form = SubscribedToTopicForm() 
subscribed_to_topic=None 
if request.user.is_authenticated(): 
    subscribed_to_topics = SubscribedToTopic.objects.filter(user_profile=request.user.get_profile()) 
initial_data = [] 
for topic in Topic.available_topics.all(): 
    start_date='' 
    if subscribed_to_topics: 
     for subscribed_to_topic in subscribed_to_topics: 
      if subscribed_to_topic.topic.id==topic.id: 
       start_date=subscribed_to_topic.start_date 
    initial_data.append({'topic_id':topic.id, 'start_date': start_date}) 
start_date_formset = StartDateFormSet(initial=initial_data) 

がPOST:

start_date_formset = StartDateFormSet(request.POST) 
topics_form = SubscribedToTopicForm(request.POST) 
start_date_formset.is_valid() 
topics_form.is_valid() 
for topic in topics_form.get_checked_topics(): 
    start_date = start_date_formset.get_start_date(topic.id) 
    subscribed_to_topic = SubscribedToTopic() 
    subscribed_to_topic.topic=topic 
    subscribed_to_topic.start_date=start_date 
    subscribed_to_topic.save() 
0

Topicモデルでフォームを作成してからuser_setマネージャを使用して、現在のユーザーがトピックに登録しているかどうかを確認する必要があります。

フォームが送信されたら、フィールドがチェックされていれば、個別のUserSubscribedToTopicオブジェクトをビューに作成できます。

関連する問題