Форум сайта python.su
0
Доброго времени суток. Реализовал я форму с радиобутонами и тут наткнулся на проблемы. Суть задачи, есть категория товаров, когда человек выбирает категорию, то ему отображаются товары этой категории. Реализовать надо с помощью радиобутонов.
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>
Офлайн
568
ИМХО, в таких случаях удобнее заюзать какой-нибудь MVC-фреймворк на клиентской стороне, например angular.js и дёргать данные с сервера аяксом.
Тут, как говорится, чучше день потерять, потом за пять минут долететь.
P.S.
Category.objects.filter(id__exact=category_id)[0]
Офлайн
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>
Офлайн
568
dreamer-s
post, get

Category.objects.get(id=category_id)
Офлайн
568
dreamer-s, Вы понимаете, что такое AJAX?
Офлайн
0
Понял, что сказал глупость. Имею общие представления. Я понимаю, как примерно (!) работает. Посмотрю, просто мне до конца неясно, как взять необходимые данные для создания радиобутонов с событиями для последующей обработки
Офлайн
568
События, картинки, нихрена не понятно.
Нарисуйте в паинте, чего Вы хотите.
Офлайн
0
допустим есть 2 категории. В первой 3 товара, во второй 2. Человек переходит по какой-то категории и ему соответственно отображаются 3 или 2 радиобутона с наименованиями товаров. По клику на радиобутон меняется картинка товара на соответствующий выбраного радиобутона. Собственно вот. Ну а в дальнейшем при submit идет добавление товара в корзину.
Офлайн
0
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')
Офлайн
568
>>>разницы все равно нет
Как говорил Чапаев, есть Петька один нюанс.
Ок.
Давай по порядку. Нужна форма с выбором категорий в виде радиобаттонов?
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>
Офлайн