Как обработать форму с несколькими чекбоксами с разными значениями и одинаковыми именами в django?
У меня проблема с обработкой формы с несколькими чекбоксами с разными значениями, но одинаковыми именами, используя django. HTML:
<form name="form1" method="post" id="formToCheck">
{% csrf_token %}
<div class="row form-group">
{% for icon in icons_to_show %}
<div class="col-md-{{ number }}">
<div class="center">
<i class="large material-icons" style="color: darkslategray">{{ icon }}</i>
<p>{{ icon }}</p>
<label for={{ icon }}>
<input type="checkbox" name="display_type" value="{{ icon }}" id={{ icon }}/>
<span>Choose</span>
</label>
</div>
</div>
{% endfor %}
<button type="submit" class="btn btn-primary blue"
style="text-align: center; align-items: center">Submit
</button>
</div>
</form>
models.py
class MemoryResult(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
created_at = models.DateTimeField(auto_now=True, null=True)
picked_imges_names = models.CharField(max_length=255, null=True)
results = models.FloatField(null=True)
status = models.CharField(max_length=255, null=True)
def __str__(self):
return '{}'.format(self.images_names)
@receiver(post_save, sender=User)
def create_memory_results(sender, instance, created, **kwargs):
if created:
MemoryResult.objects.create(user=instance)
views.py
class MemoryImagesView(TemplateView):
template_name = 'accounts/memory.html'
icon_to_show = []
def dispatch(self, request, *args, **kwargs):
previous_images = self.request.user.memoryimage_set.all().last().images_names.strip("[]'").replace("'",
"").replace(
" ", "").split(",")
how_many = 9 - len(previous_images)
self.icon_to_show = render_icons(how_many) + previous_images
response = super(MemoryImagesView, self).dispatch(request, *args, **kwargs)
return response
def get_context_data(self, **kwargs):
context = super(MemoryImagesView, self).get_context_data(**kwargs)
return context
def get(self, request):
memory = MemoryResult.objects.filter(user=request.user)
frontend = {
'title': 'Memory Results',
'number_mem': 'abcdefghi',
'icons_to_show': self.icon_to_show,
'number': 4,
'memory': memory
}
return render(request, 'accounts/memory.html', frontend)
def post(self, request):
picked_icons = []
print(self.icon_to_show)
for i in range(9):
if request._post['display_type'] in self.icon_to_show:
picked_icons.append(request._post['display_type'])
print(picked_icons)
return render(request, 'accounts/home.html')
Я знаю, что здесь не должно быть цикла for, но я пробовал разные подходы с добавлением forloop.counter к имени input, но это не работает так же хорошо. Единственное значение, которое сохраняется - это последнее выбранное значение. Я не хочу использовать форму в forms.py, потому что изображения меняются при обновлении страницы, поэтому я делаю это в моем представлении. Когда я хочу прочитать только значение из формы с пользовательским именем, сохраняется только последнее выбранное значение, и я не знаю, как получить их все. Можете ли вы помочь мне решить эту проблему?
Чтобы различать элементы в HTML, используйте разные идентификаторы: добавить счетчик:
def get(self, request):
memory = MemoryResult.objects.filter(user=request.user)
frontend = {
'title': 'Memory Results',
'number_mem': 'abcdefghi',
'icons_to_show': self.icon_to_show,
'number': 4,
'counter': self.icon_number #initialize it somewhere probably utilizing how_many (I don't know all of your codeú
'memory': memory
}
return render(request, 'accounts/memory.html', frontend)
Затем сделайте значок id + счетчик