Отображение полей модели в django в выпадающем списке

#python #html #django #django-forms #django-templates

#python #HTML #django #django-формы #django-шаблоны

Вопрос:

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

 class Order(models.Model):
    STATUS = (
        ('Pending', 'Pending'),
        ('Out for delivery', 'Out for delivery'),
        ('Delivered', 'Delivered'),
    )
    customer = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL)
    product = models.ForeignKey(Product, null=True, on_delete=models.SET_NULL)
    date_created = models.DateTimeField(auto_now_add=True, null=True)
    status = models.CharField(max_length=20, null=True, choices=STATUS)

    def __str__(self):
        return self.product.name
  

Я должен сделать это вручную:

 {% extends 'accounts/base.html' %}
{% load static %}
{% block main %}
    <form action="" method="post">
        {% csrf_token %}
        <div class="dropdown">
            <button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                customer
            </button>
            <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
                <a class="dropdown-item" > {{ form.customer.1 }}</a>
                <a class="dropdown-item" > {{ form.customer.2}}</a>
                <a class="dropdown-item" > {{ form.customer.3}}</a>
                <a class="dropdown-item" > {{ form.customer.4}}</a>
                <a class="dropdown-item" > {{ form.customer.5}}</a>
            </div>
        </div>
        <input type="submit" name="submit" class="btn btn-success">
    </form>
{% endblock %}
  

Это потому, что когда я попытался создать цикл, который просто выдавал бы им идентификаторы вместо чисел, он просто не отображался.

Кто-нибудь может мне помочь? 🙁

Forms.py

 from django.forms import ModelForm
from .models import *


class OrderForm(ModelForm):
    class Meta:
        model = Order  # model do którego tworzymy formę
        fields = '__all__'  # pola które dzięki niej chcemy uzupełnić
  

Views.py

 def createOrder(request):

    form = OrderForm # tworzymy obiekt który bedzie trzymał formę z plikuu forms.py

    if request.method == 'POST': # jeżeli meotda request-u to POST
        form = OrderForm(request.POST) # to zmieniami wartość obiektu na formę z requestem POST
        if form.is_valid(): # jeżeli forma jest prawidłowa
            form.save() # zapisz formę w bazie danych
            return redirect('/') # przekieruj na stronę główną

    return render(request, 'accounts/order_form.html', {
        'form': form, # przekazujemy formę do html-a aby mogła zostać wyświetlona
    })
  

Ответ №1:

Можете ли вы опубликовать свой forms.py ? Это должно быть сделано так, как вы хотите, с помощью Django ModelForm.

Вы даже можете фильтровать с его помощью некоторые свойства, как в примере ниже:

 class WarehouseForm(forms.ModelForm):
    forms.ModelChoiceField(required=False, widget=forms.Select, queryset=Item.objects.filter(name__in=['Test1', 'Test2']))

    class Meta:
        model = Warehouse
        fields = ['item', 'location']
  

Потому что я вижу, что проблема не в формах, а в их фактическом использовании.

У вас должна быть форма, переданная в ваш шаблон представлением, вот так:

 def some_view(request, pk):
    order = Order.objects.get(id = pk)
    form = OrderForm(instance = order)
    return render(request, 'yourtemplate.html', {'form':form})
  

Тогда в html вы даже можете написать:

 <form methodd="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <input type='submit' value="Submit">
</form>
  

Если вы хотите отображать поле за полем, вы можете использовать:
{{ form.customer }}

Если вы действительно хотите просто выполнить цикл, используйте

 {% for customer in form.fields.customer.choices.queryset %}
    <a class="dropdown-item" > {{ customer }}</a>
{% endfor %}
  

и это должно более или менее сработать, но это, вероятно, приведет к тому, что form.is_valid будет действовать не так, как ожидалось.

Комментарии:

1. Это передается представлением. Я также добавил это в вопрос.

2. Все отлично работает и показывает, но я просто не могу заставить его отображаться в for вместо записи .1.2.3 и т.д.

3. Я знаю, но тогда форма выглядит очень простой, и нет никакого способа ее стилизовать.

4. Да, но предполагается, что это должно отображаться в выпадающем списке из bootstrap, поэтому я должен получить доступ к каждой опции из form.customer. Я могу сделать это, набрав затем form.customer.1 . 2 и так далее, но это работает только для небольшого числа клиентов. Итак, я бы хотел, чтобы это было в цикле, подобном этому, для i в form.customer, а затем передать i в качестве идентификатора form.customer.i вместо form.customer.1, но он не хочет работать, когда я это делаю.