Create user preferences form with checkbox

0

I want to create a form of the type:

<form>
<fieldset>
  <legend>Deportes:</legend>
    <input type="checkbox" name="futbol" value="3"> futbol<br>
    <input type="checkbox" name="basket" value="4"> basket<br>
    <input type="checkbox" name="natacion" value="6"> natación<br>
    <input type="checkbox" name="voley" value="7"> voley<br>
</fieldset>
<fieldset>
  <legend>Música:</legend>
    <input type="checkbox" name="clasica" value="8"> Clásica<br>
    <input type="checkbox" name="rock" value="5"> Rock<br>
    <input type="checkbox" name="pop" value="10"> Pop<br>
</fieldset>
<input type="submit" name="submit" value="guardar">
</form>

in models.py I have:

class User(AbstractUser):
    name = models.CharField(_('Name of User'), blank=True, max_length=255)
    surname = models.CharField(_('Surname'), blank=True, max_length=255)
    preferences = models.ManyToManyField(Preferences, related_name='preferences_user', blank=True)

    class Meta:
        ordering = ['username']

    def __str__(self):
        return self.username

    def get_absolute_url(self):
        return reverse('users:detail', kwargs={'username': self.username})

class Preferences(models.Model):
    name = models.CharField(_('Preference'), blank=False, max_length=100)
    parent = models.IntegerField(_('Parent preference'))

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('parent',)

In the table "Preferences" I have the data as follows:

ID   name    parent
1    Deportes 0
2    Música   0
3    futbol   1
4    basket   1
5    Rock     2
etc...

I have tested in several ways with UpdateView and forms .. etc and I can not make the preferences in which parent == 0 put them as "legend" in the html tag "fieldset"

Thanks

Ok, I add the view and form

forms.py

class PreferencesForm(forms.ModelForm):
    class Meta:
        model = User
        fields = ('preferences',)
        widgets = {'preferences': forms.CheckboxSelectMultiple(attrs={'class': 'mi-clase'})}

views.py

class UserPreferences(LoginRequiredMixin, UpdateView):

    model = User
    template_name_suffix = '_preferences_form'
    form_class = PreferencesForm

    # send the user back to their own page after a successful update
    def get_success_url(self):
        return reverse('users:detail',
                       kwargs={'username': self.request.user.username})

    def get_object(self):
        # Only get the User record for the user making the request
        return User.objects.get(username=self.request.user.username)

    def get_context_data(self, **kwargs):
        context = super(UserPreferences, self).get_context_data(**kwargs)
        context['form1'] = Preferences.objects.all()
        return context

Template

<form method="post" action="{% url 'users:update_preferences' %}" enctype="multipart/form-data">
{% csrf_token %}
 {{ form }}
 <button type="submit" class="btn">Update</button>
</form>
    
asked by agus 31.01.2018 в 00:34
source

1 answer

0

In the template you can ask for specific fields of the model in the following way (since the queryset you sent as form1 in the context from the view and that are all the objects you must iterate), here then for each user, we iterated the preferences header and then within the, manytomany preferences:

{% for user in users %}
    {% for preference in preferences %}
        {% if preference.parent == 0 %}
            <fieldset>
              <legend>{{ preference.name }}</legend>
              {% for pref in user.preferences.all %}
                <input type="checkbox" name="futbol" value="3">{{ pref.name }}<br>
            {% endfor %}
            </fieldset>
        {% endif %}
    {% endfor %}
{% endfor %}

I hope it serves you.

    
answered by 31.01.2018 в 22:55