#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, но он не хочет работать, когда я это делаю.