首页 > 解决方案 > 无法在 Django 中使用 RadioSelect 按钮来获取输出

问题描述

我正在尝试创建一个站点,该站点以 RadiSelect 按钮的形式接收用户输入,并且基于该按钮,必须在数据库上运行查询并显示结果。

这是html:

    {% block content %}
       <div class="container">
       <h1>Welcome to your page, @{{ user.username }}</h1>
       <h3>Select vendor to check your balance!</h3>
       <br>
    <form method="POST" class="form">
        {% csrf_token %}
        {% bootstrap_form form %}
        {% buttons %}
        <button type="submit" class="btn btn-primary">Check Balance</button>
        {% endbuttons %}
    </form>
    {% if args.model %}
       <h4>You need to pay Rs {{ args.model }} to vendor {{ args.choice }}    
       </h4>

        {% endif %}
    </div>
    {% endblock %}

urls.py:

    from django.urls import path
    from django.contrib.auth import views as auth_views
    from . import views

    app_name = 'profiles'

    urlpatterns = [
        path('adminKaLogin/', views.adminKaPage, name="adminHome"),
        path('userLogin/', views.userKaLog, name="userHome"),
    ]

表格.py

    from django import forms
    from django.contrib.auth import get_user_model

    vendor_choices = [
        ('1','Vendor 1'),('2',"Vendor 2"), ("3", "Vendor 3"),
    ]    

    class select_vendor_form(forms.Form):
        Vendor_choices = forms.ChoiceField(choices=vendor_choices,
                                    widget=forms.RadioSelect)

视图.py

    def userKaLog(request):
        form = select_vendor_form()
        if request.method=="POST" and form.is_valid():
            choice = form.cleaned_data['Vendor_choices']
            print(choice)
            records = userData.objects.get(Vendor_number = ('choice')).aggregate(Sum('itemPrice'))
            args = {'form': form, 'choice': choice, 'model':records}
            return render(request, 'profiles/useLogin.html', args)
        else:
            return render(request, 'profiles/userLogin.html', {'form': form})

模型.py:

    from django.db import models
    from datetime import datetime
    from django.contrib.auth.models import User 

    class userData(models.Model):
        name = models.OneToOneField(User, on_delete=models.CASCADE)
        balance = models.IntegerField()
        date_of_payment = models.DateTimeField(default = datetime.now())
        vendor_number  = models.IntegerField()

如果此人选择供应商 1 的单选按钮,则输出应该是该用户欠供应商 1 的总金额。我无法找到我出错的地方。

标签: djangodjango-formsdjango-templatesdjango-views

解决方案


据我所知,表单永远不会获取 POST 数据。请务必将数据提供给表单,以使其具有有效的结果。您可以在您的视图中执行以下操作:

def userKaLog(request):
  form = select_vendor_form()
  # Check if the current method was a POST method
  if request.method=="POST":
    # Initiate the form again, but with post data
    form = select_vendor_form(request.POST)
    if form.is_valid():
      choice = form.cleaned_data['Vendor_choices']
      choice = int(choice)
      records = userData.objects.get(Vendor_number = choice).aggregate(Sum('itemPrice'))
      args = {'form': form, 'choice': choice, 'model':records}
      return render(request, 'profiles/useLogin.html', args)

  # Return the normal results, form will display an error message if POST was triggered
  return render(request, 'profiles/userLogin.html', {'form': form})

您可以在此处阅读有关表单的更多信息:Django Forms API

可能是您的 userData 检索出现问题,因为在您当前的模型文件中没有 itemPrice。所以你可能也需要检查一下。


推荐阅读