Django persist Выборы ModelMultipleChoiceField - PullRequest
0 голосов
/ 01 июля 2018

У меня есть ModelMultipleChoiceField, который позволяет пользователю выбрать один или несколько наборов из моей модели "сообщества" (сродни тому, как пользователь присоединяется к subreddit). Когда пользователь открывает страницу, чтобы выбрать сообщества, флажки в полях, выбранных пользователем ранее, отсутствуют. Я хотел бы сделать так, чтобы ранее выбранные сообщества оставались с флажками, и поэтому, когда пользователь нажимает кнопку «Отправить», его предыдущие варианты не будут забыты, если они не выберут предыдущие варианты.

Вот моя форма:

class CustomChoiceField(forms.ModelMultipleChoiceField):
    def label_from_instance(self, obj):
        return obj.name

class CommunitySelectForm(forms.ModelForm):
    community_preferences = CustomChoiceField(queryset=Community.objects.all(), widget=forms.CheckboxSelectMultiple)

    class Meta:
        model= UserQAProfile
        fields = ['community_preferences']

А вот и мой шаблон:

<div class="col-sm-8 input">
  <form method="post" enctype='multipart/form-data'>
      {% csrf_token %}
      {{ form.as_p }}
      <input class="btn btn-submit pull-left"  type="submit" value="Choose Communities" />
  </form>
</div>

Модель UserQAProfile имеет поле ManyToMany для хранения настроек:

community_preferences = models.ManyToManyField(Community)

Вот представление, которое инициализирует форму:

def joinCommunities(request, user_id):
    user_ob = get_user_model().objects.filter(id=user_id).first()
    full_user_profile = UserQAProfile.objects.filter(user=user_ob).first()

    if request.method == 'POST':
        form = CommunitySelectForm(request.POST, instance=full_user_profile)
        if form.is_valid():

            form.save()
            context = {'user': full_user_profile, 'full_user_profile':full_user_profile}
            context['communities'] = context['user'].community_preferences.all()

            return render(request, 'qa/profile.html', context)
    else:
        form = CommunitySelectForm()
    return render(request, 'qa/select_communities.html', {'form' : form})

1 Ответ

0 голосов
/ 02 июля 2018

Вы передаете instance в форму только во время POST запросов, что означает, что когда пользователь повторно просматривает страницу с запросом GET, форма не привязывается ни к какому экземпляру, и предыдущие выборы не не появляется.

Вам просто нужно передать экземпляр при инициализации формы:

else:
    form = CommunitySelectForm(instance=full_user_profile)
return render(request, 'qa/select_communities.html', {'form' : form})
...