У меня есть 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})