Django: Prefill a ManytoManyField
- by Emile Petrone
I have a ManyToManyField on a settings page that isn't rendering. The data was filled when the user registered, and I am trying to prefill that data when the user tries to change it.
Thanks in advance for the help!
The HTML:
{{form.types.label}}
{% if add %}
{{form.types}}
{% else %}
{% for type in form.types.all %}
{{type.description}}
{% endfor %}
{% endif %}
The View:
@csrf_protect
@login_required
def edit_host(request, host_id, template_name="host/newhost.html"):
host = get_object_or_404(Host, id=host_id)
if request.user != host.user:
return HttpResponseForbidden()
form = HostForm(request.POST)
if form.is_valid():
if request.method == 'POST':
if form.cleaned_data.get('about') is not None:
host.about = form.cleaned_data.get('about')
if form.cleaned_data.get('types') is not None:
host.types = form.cleaned_data.get('types')
host.save()
form.save_m2m()
return HttpResponseRedirect('/users/%d/' % host.user.id)
else:
form = HostForm(initial={
"about":host.about,
"types":host.types,
})
data = { "host":host, "form":form }
return render_to_response(template_name,
data,
context_instance=RequestContext(request))
Form:
class HostForm(forms.ModelForm):
class Meta:
model = Host
fields = ('types', 'about', )
types = forms.ModelMultipleChoiceField(
widget=forms.CheckboxSelectMultiple, queryset=Type.objects.all(),
required=True)
about = forms.CharField(
widget=forms.Textarea(),
required=True)
def __init__(self, *args, **kwargs):
super(HostForm, self).__init__(*args, **kwargs)
self.fields['about'].widget.attrs = {
'placeholder':'Hello!'}