Форум сайта python.su
Доброго времени суток. Реализовал я форму с радиобутонами и тут наткнулся на проблемы. Суть задачи, есть категория товаров, когда человек выбирает категорию, то ему отображаются товары этой категории. Реализовать надо с помощью радиобутонов.
views.py
def product_once(request, category_id): product_once = Category.objects.filter(id__exact=category_id)[0] product_value = Product.objects.filter(category_id__exact=category_id) if request.method == 'POST': form = ChooseForm(data=request.POST) if form.is_valid(): pass else: form = ChooseForm(param=category_id) context = {'product': product_once, 'value': product_value, 'form':form} return render(request, 'product_once.html', context)
class ChooseForm(forms.Form): radio = forms.ChoiceField() def __init__(self, param=None, *args, **kw): super(ChooseForm, self).__init__(*args, **kw) self.fields['radio'].widget=forms.RadioSelect() self.fields['radio'].label='' self.fields['radio'].empty_label=None self.fields['radio'].choices =Product.objects.filter(category_id__exact=param).values_list('id', 'name', 'id', 'photo')
<form action="." method="post">{% csrf_token %} <table> {% for field in form %} {{ field }} {% endfor %} <tr> <td colspan="2"><input type="submit" value="Купить" /></td> </tr> </table> </form>
self.fields['radio'].choices =Product.objects.filter(category_id__exact=param).values_list('id', 'name', 'id', 'photo')
{% for p in form.fields.radio.choices %} <tr> <td><input type="radio" name="radio" value="{{ p.pk }}"></td> <td>{{ p.name }}</td> <td>{{ p.photo }}</td> </tr> {% endfor %} <tr>
Офлайн
ИМХО, в таких случаях удобнее заюзать какой-нибудь MVC-фреймворк на клиентской стороне, например angular.js и дёргать данные с сервера аяксом.
Тут, как говорится, чучше день потерять, потом за пять минут долететь.
P.S.
Category.objects.filter(id__exact=category_id)[0]
Офлайн
post, get… Тут вопрос в том, почему не получается отображать эти данные в шаблоне. Попробую get, но мне кажется это не изменит ситуацию. Да, смену картинок на клиентской стороне с помощью js необходимо реализовать, но и как то надо добавлять данные в корзину, то есть все упирается в доставание данных. Дело в том, что если я делаю
<form action="." method="post">{% csrf_token %} <table> {% for field in form %} {{ field }} {% endfor %} <tr> <td colspan="2"><input type="submit" value="Купить" /></td> </tr> </table> </form>
Офлайн
dreamer-s
post, get
Category.objects.get(id=category_id)
Офлайн
dreamer-s, Вы понимаете, что такое AJAX?
Офлайн
Понял, что сказал глупость. Имею общие представления. Я понимаю, как примерно (!) работает. Посмотрю, просто мне до конца неясно, как взять необходимые данные для создания радиобутонов с событиями для последующей обработки
Офлайн
События, картинки, нихрена не понятно.
Нарисуйте в паинте, чего Вы хотите.
Офлайн
допустим есть 2 категории. В первой 3 товара, во второй 2. Человек переходит по какой-то категории и ему соответственно отображаются 3 или 2 радиобутона с наименованиями товаров. По клику на радиобутон меняется картинка товара на соответствующий выбраного радиобутона. Собственно вот. Ну а в дальнейшем при submit идет добавление товара в корзину.
Офлайн
post, getЯ прочитал, что написал, прошу прощения, двое суток на то время не спал. Хотя тогда я прекрасно понял что вы имели в виду
Category.objects.filter(id__exact=category_id)[0]
Category.objects.get(id=category_id)
Кароче если в коде можно сделать вот это:если я использую queryset у меня данные не отображаются вообще. Поэтому юзаю choices.
form.fields.queryset = pen.objects.all()
То в шаблоне можно сделать так:
{% for p in form.pen.queryset %}
self.fields['radio'].choices =Product.objects.all(category_id__exact=param).values_list('id', 'name', 'photo')
Офлайн
>>>разницы все равно нет
Как говорил Чапаев, есть Петька один нюанс.
Ок.
Давай по порядку. Нужна форма с выбором категорий в виде радиобаттонов?
class CategoryForm(forms.ModelForm): class Meta: model = Category widgets = { "name": forms.widgets.RadioSelect(), }
<form method="post">{% csrf_token %} {{ form.as_ul }} <input type="submit" value="Выбери категорию"> </form>
Офлайн