【发布时间】:2015-04-18 03:23:05
【问题描述】:
我有一个 Django 1.6 应用程序,该应用程序将包含一个显示客户列表的表单,每个名称旁边都有一对“批准”和“拒绝”单选按钮,以指示我们是批准还是拒绝他们的付款方式。我希望在首次呈现表单时将每个单选按钮默认设置为“拒绝”。我还想在包含客户用户 ID 的每一行中包含一个隐藏的“uid”字段。当管理员点击他/她想要批准的每个用户名旁边的 Approve 按钮然后提交表单时,视图应该读取每个用户的每个隐藏的 id 值,检查单选按钮,如果用户被批准,则更新模型.表单如下所示:
customer1 (hidden id) [ ] approve [x] reject
customer2 (hidden id) [ ] approve [x] reject
...
customerN (hidden id) [ ] approve [x] reject
我有三个问题我不太明白如何解决:
- 如何将包含我的客户用户名和 ID 的查询集与包含每个查询集对象的单选按钮对的 FormSet 结合起来?我很确定我需要使用 FormSet 来保存单选按钮,并且我认为我需要将 formset 的“初始”值设置为查询集,但我无法让它们“连接”以便表单看起来像什么我已经在上面展示了。当我在浏览器中执行“查看源代码”时,我没有看到我的帐户查询集对象。
- 如何通过 new_accounts 查询集将来自 Account 模型的用户列的客户 ID 连接到表单中的 uid 字段?
- 如何遍历提交的表单集并提取用户 ID 和单选按钮对象进行检查?
我真的很难集中精力完成这些任务。非常感谢您的帮助。
# views.py
def review_payment_methods(request, template):
if request.method == "POST":
payment_method_form = ReviewPaymentMethodForm(request.POST)
if payment_method_form.is_valid():
# How to iterate through form and pull out ids and radio button values??
# Update Account table here
return HttpResponseRedirect('/admin/')
else:
new_accounts = Account.objects.filter(method_approved=False).values()
PaymentMethodFormset = formset_factory(ReviewPaymentMethodForm, extra=new_accounts.count())
formset = PaymentMethodFormset(initial=new_accounts) # This doesn't seem to work
return render_to_response(template, locals(), context_instance=RequestContext(request))
# models.py
class Account(models.Model):
"""A user's account."""
user = models.OneToOneField(User, primary_key=True, unique=True)
method_approved = models.BooleanField(default=False) # This contains Approve/Reject
# forms.py
from django import forms
from django.utils.safestring import mark_safe
class ReviewPaymentMethodForm(forms.Form):
class HorizontalRadioRenderer(forms.RadioSelect.renderer):
def render(self):
return mark_safe(u'\n'.join([u'%s\n' % w for w in self]))
DECISION_CHOICES = (('1', 'Approve'), ('2', 'Reject'))
uid = forms.IntegerField(widget=forms.HiddenInput)
decision = forms.ChoiceField(
choices = DECISION_CHOICES,
widget = forms.RadioSelect(renderer=HorizontalRadioRenderer),
initial = '2', # 1 => Approve, 2 => Reject
)
# review_payment_methods.html
<div class="custom-content">
<h1>Review Payment Methods</h1>
<form action="." method="post">{% csrf_token %}
{% for form in formset %}
{{ form.as_p }}
{% endfor %}
<input type="submit" value="Submit" />
</form>
</div>
【问题讨论】:
标签: django django-models django-forms django-views