Django - Как создать форму флажка через внешний ключ - PullRequest
0 голосов
/ 25 апреля 2019

Я занимаюсь разработкой сайта, где пользователи могут регистрировать любимые продукты на этом сайте. Итак, я хотел бы создать форму флажка, разделенную внешним ключом, как это.

Фрукты
□ яблоко
☑︎ оранжевый
☑︎ Лимон

Растительное
□ помидор
☑︎ баклажаны
☑︎ огурец


Таблица
● FoodsType
id | Имя
1, фрукты
2, Овощной

● Продукты питания
id | имя | type_id
1, яблоко, 1
2, оранжевый, 1
3, Лимон, 1
4, помидор, 2
5, баклажан, 2
6, огурец, 2

● UserFoods
id | food_id | user_id
1, 2, 1
2, 3, 1
3, 5, 1
4, 6, 1
5, 2, 2
6, 3, 2
7, 5, 2
8, 2, 3

Вот мой код:

▪️ models.py

class FoodsType(models.Model):
    name = models.CharField(max_length=255)

    def __str__(self):
        return self.name

class Foods(models.Model):
    name = models.CharField(max_length=255)
    type = models.ForeignKey(FoodsType, on_delete=models.CASCADE)

    def __str__(self):
        return self.name

class UserFoods(models.Model):
    foods = models.ManyToManyField(Foods)
    user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)

▪️ form.py

class FoodsFrom(forms.ModelForm):
    foods = forms.ModelMultipleChoiceField(label='favorite foods', queryset=Foods.objects.all(), widget=forms.CheckboxSelectMultiple)

    class Meta:
        model = Foods
        fields = ('name', 'type')

▪️ view.py

class registerForm(generic.CreateView):

    def get(self, request):
        food_form = FoodsFrom()
        context = {
            'food_form': food_form
        }
        return render(request, 'register.html', context)

▪️ register.html

{% for field in food_form %}
    <tr>
        <th><label for="{{ field.id_for_label }}">{{ field.label }}</label></th>
        <td>{{ field }} {{ field.errors }}</td>
    </tr>
{% endfor %}

текущий результат
□ яблоко
☑︎ оранжевый
☑︎ Лимон
□ помидор
☑︎ баклажаны
☑︎ огурец

1 Ответ

0 голосов
/ 25 апреля 2019

Вы можете попробовать использовать встроенный шаблон перегруппировки: https://docs.djangoproject.com/fr/2.2/ref/templates/builtins/#regroup

Для вашего примера это должно выглядеть так:

{% regroup food_form.foods by food_form.type as foods_list %}

    <ul>
{% for type in foods_list %}
    <li>{{ type.grouper }}
    <ul>
        {% for food in type.list %}
          <li>{{ food.foods }}: {{ food.name }}</li>
        {% endfor %}
    </ul>
    </li>
{% endfor %}
</ul>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...