Hi Everyone,
I am trying to add a multiple choice of color for my objects.
And to do it with a Checkbox
But I dont know what is the best way to do it … perhaps, you can help me ?
-
Do I list all the color in a foreign model ? This can be mofify by the user without enter in the code.
class Settings_Color(models.Model):
name = models.CharField(max_length = 20, blank=True)
check = models.BooleanField(default=False)
def str(self):
return self.name
-
Do I have to use a list directly in my main model ?
class My_Main(models.Model):
GENDER_CHOICES = [
(‘Yellow’,‘Yellow’),
(‘Red’,‘Red’),
]
-
Depend on the choice,
4.a. Instance creation in views.py ? How to do ?
4.b. How a display this in my template ?
4.c. How to save the result in the model ?
Thanks for your help …
Pierre
See the CheckboxSelectMultiple
widget.
You can store the selected choices in many different ways:
(These are listed roughly in the order that I would suggest them, best to worst.)
-
Many-to-many field between the base model and the model defining the valid choices.
-
As entries in a related table with a ForeignKey to the base table.
-
As elements of a JSONField or PostgreSQL ArrayField
-
As a character string with a delimiter between elements.
There are probably some other options as well, but these are what I’ve seen and used most often.
Hi Ken,
Thanks for your help, I try your first solution (the best one …
But just 2 questions :
- How to create the “color” manytomany default relation ?
- How to get the user value (the boxes he check) and save it into the models
Another thanks
So, what I does:
models.py:
class Color(models.Model):
name = models.CharField(max_length = 20, blank=True)
check = models.BooleanField(default=False)
class Main(models.Model):
color = models.ManyToManyField(Color, related_name="color")
Views.py:
def the_main(request,my_id):
my_main = Main.objects.get(id=my_id)
my_colors = my_main.color.all()
template.html
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<table id="table" class="table dt-responsive">
<thead>
<tr>
<th class="align-middle text-center">Name</th>
<th class="align-middle text-center">Check</th>
</tr>
</thead>
<tbody>
{% for my_color in my_colors %}
<tr>
<td class="align-middle text-center">{{ my_color.name }}</td>
<td class="align-middle text-center">
{% if my_color.check %}
<div class="form-check">
<input class="form-check-input" type="checkbox" checked="checked" value={{my_color.id}} name="boxes">
</div>
{% else %}
<div class="form-check">
<input class="form-check-input" type="checkbox" value={{my_color.id}} name="boxes">
</div>
{% endif %}
</td>
</tr>
{% endfor%}
</tbody>
</table>
<button class="btn btn-secondary" name="btn_color" type="submit">Save</button>
</form>
If you create a model form with that as a form field, and have the template render it as a form, then it functions just like any other form field.
Hmmmm, I think, I doing something wrong with the Form management …
The code is ok, I can display the list, the checkbox information are display and saved … but it is the same color set (the last one saved) for all my main object.
I add this in forms.py :
class Color_Form(ModelForm):
class Meta:
model = Color
fields = '__all__'
and in views.py, I replace the ‘my_colors’ affectation with :
my_colors = Color_Form(instance=my_main)
But the result display is only the labels of color : ‘name’ and ‘check’
and not all the colors to select them …
Another idea ?
The form should be for the instance of Main for which you are trying to select a set of Color. You are editing an instance of Main, trying to associate that instance with one or more instances of Color.
I try a lot a things but with no result, I think, I don’t really understand what to do.
Perhaps, do you have a small example to help me understand ?
What do you think is causing the issue here? Are you ok with a regular form and it’s just the many-to-many relationship that is causing a problem? Or are you not understanding how a form works?
1 Like
I found a youtube serie who explain this and help me to solve my problem.
I give here the link if it can help other …
Thanks for your help Ken