Voskresenskyi
@Voskresenskyi
Начинающий джанговод!

Как передать через форму список, в одной из строк которого имеется список?

- клиент добавляет айдишники товаров в сессию!
- в корзине редактирует выведенные из сессии товары и переходит на оформление заказа, где заполняет свои данные и завершает заказ, чем сохраняет заказ в бд! Для оформлении заказа я использую форму модели Order в которой одно поле (товары из сессии клиента) скрытое и имеет оно несколько товаров(список) так вот передать этот список через форму я и не могу, а только последний элемент...
- request.POST.getlist("name_product") я так понимаю нужно использовать для получения указанного списка, но как прикрутить его?

models.py

class Order(models.Model):
	first_name = models.CharField(u"Имя заказчика", max_length= 100)
	second_name = models.CharField(u"Фамилия заказчика", max_length= 100)
	phone = models.CharField(u"Контактный телефон заказчика", max_length= 100)
	email = models.EmailField(u"Электронная почта")
	address = models.CharField(u"Адрес доставки", max_length= 100)
	name_product = models.CharField(u"Товары заказа", max_length= 100)
	def __iter__(self):
		return[self.first_name]
	def __str__(self):
		return self.first_name
	class Meta:
		verbose_name="Заказ"
		verbose_name_plural="Заказы"

forms.py

class OrderForm(ModelForm):
	class Meta:
		model = Order
		fields = ["first_name","second_name",
					"phone","email","address",
					"form_shipping","form_payment",
					"name_product"
		]

views.py

def order(request):
	cart = request.session.get('cart')
	product_items = Product.objects.filter(id__in=cart)
	#беру товары из сессии
        if request.method == "POST":
		form = OrderForm(request.POST)
		request.POST.getlist("name_product") #нужно где-то прикрутить
		if form.is_valid():
			instance = form.save(commit=False)
			instance.save()
			return redirect("/")
		else:
			form = OrderForm()
	content = {
		"product_items":product_items
	}
	return render (request, "order.html", content)

order.html
<form action="" method="POST">{% csrf_token %}

	<label for="id_first_name">Имя заказчика:</label> <input id="id_first_name" maxlength="100" name="first_name" type="text" />
	<label for="id_second_name">Фамилия заказчика:</label> <input id="id_second_name" maxlength="100" name="second_name" type="text" />
	<label for="id_phone">Контактный телефон заказчика:</label> <input id="id_phone" maxlength="100" name="phone" type="text" />
	<label for="id_email">Электронная почта:</label> <input id="id_email" maxlength="254" name="email" type="email" />
	<label for="id_address">Адрес доставки:</label> <input id="id_address" maxlength="100" name="address" type="text" />
	{% for product_item in product_items %}
	<input type='hidden' name="name_product" value="{{ product_item }}"/> ВОТ ЗДЕСЬ ЗАГВОЗДКА!!!!
	{% endfor%}

	<input type="submit" value="Завершить заказ!" />
</form>

При рендере скрытое поле выглядит вот так



Именно такой подход к решению для меня не критичен! Может есть и другие варианты выхода?
  • Вопрос задан
  • 333 просмотра
Пригласить эксперта
Ответы на вопрос 2
Можно создать для каждого продукта поле в конструкторе формы:
class OrderForm(ModelForm):
    def __init__(self, request, *args, **kwargs):
        super(OrderForm, self).__init__(*args, **kwargs)
        cart = request.session.get('cart')
        product_items = Product.objects.filter(id__in=cart)
        for product in product_items:
            key = 'product_{index}'.format(index=product.pk)
            self.fields[key] = forms.BooleanField(required=False) # тут поле какое тебе удобней

    def clean(self):
        # здесь обрабатываешь поля из self.cleaned_data
        return self.cleaned_data


Также можно для каждого продукта создавать по специальной форме и запросами(или аяксом) удалять/менять количество с помощью нее.
Ответ написан
Комментировать
можешь воспользоваться вот таким полем для формы https://gist.github.com/aklim007/c325753b3e171adb8674
какраз для валидации заранее неизвестного списка объектов заданного типа.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы