Django ModelMultipleChoiceField Form

2.1k Views Asked by At

On my website, I've got a "Compose Email" page with three fields - Subject, Recipients, & Body. In my database, I've got this custom user model in models.py:

class MyUser(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    school = models.CharField(max_length=100)

    def __unicode__(self):
        return self.user

I want to create a form to import contacts that includes all of the MyUser objects. Currently, I've got this in forms.py:

class ContactForm(forms.Form):
    contacts = forms.ModelMultipleChoiceField(widget=forms.Select(attrs={'size':'13', 'onchange':'this.form.action=this.form.submit()'}), queryset=MyUser.objects.all().order_by('user'))#, empty_label=None)

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        self.fields['contacts'].queryset = MyUser.objects.all()

In my views.py, I've got the following view:

def import_contacts(request):
    contact_form = ContactForm()
    if request.method == "POST":
        contact_form = ContactForm(request.POST)
        if contact_form.is_valid:
            # send data to be processed
            return render(request, 'compose_email.html', {
                'form': contact_form,
            })
    errors = contact_form.errors or None  # form not submitted or it has errors
    return render(request, 'apple/contact_import_form.html', {
        'form': contact_form,
        'errors': errors,
    })

contact_import_form.html

...
<div class="form-panel">
  <form method="post">
    {% csrf_token %}
    {{ form.as_p }}
    <div id="sub">
      <button type="submit" class="button">Add</button>
    </div>
  </form>
</div>
...

And finally, here is the .html file from which I link to import_contact_form.html compose_email.html:

...
<a class="emailButton" id="b1" href="/gordie/home/templates/">Import Template</a>
<a class="emailButton" id="b2" href="/home/send_email/import_contacts/">Import Contacts</a>
  <!-- <button class="emailButton" id='b2'>Import Contacts</button> -->
  <div class="form-panel">
    <form method="post">
      {% csrf_token %}
      {{ form.as_p }}
      <div id="sub">
        <button type="submit" class="button">Send</button>
      </div>
    </form>
  </div>
...

When I get to the Import Contacts page, I don't see any form, only a button that says Add. I'd like to have some list of contacts (dropdown would be fantastic). It's possible I have an issue elsewhere (fairly new to Django), but I am led to believe I've done something wrong with the ModelMultipleChoiceField. What do you think?

0

There are 0 best solutions below