【问题标题】:How to pass data from a template to the Django side如何将数据从模板传递到 Django 端
【发布时间】:2021-04-21 10:47:10
【问题描述】:

我刚刚开始编写 Python Django 代码。我只是想做一个基本的登录项目。我试图将登录变量从 HTML 端传递到文件 views.py.

这是我的 HTML 代码:

<form action="/index" method="post">

    {% csrf_token %}

    <div class="form-group">
      <label for="username">Username</label>
      <input class="form-control" id="username" type="email"/>
    </div>

    <div class="form-group">
      <div class="d-flex justify-content-between">
        <label for="password">Password</label><a class="fs--1">Forgot Password?</a>
      </div>
      <input class="form-control" id="password" type="password" />
    </div>

    <div class="custom-control custom-checkbox">
      <input class="custom-control-input" type="checkbox" id="card-checkbox" checked="checked"/>
      <label class="custom-control-label" for="card-checkbox">Remember me</label>
    </div>

    <div class="form-group">
      <button class="btn btn-primary btn-block mt-3"
              type="submit"
              id= "login"
              name="submit">Log in</button>
    </div>
</form>

我的 urls.py 文件:

urlpatterns = [
    path('', views.loginPage, name="login"),
    path('index', views.home, name="index")
]

我的 forms.py 文件:

from django import forms

class LoginForm(forms.Form):
    username = forms.EmailField(label="Username"),
    password = forms.CharField(label="Password")

还有我的 views.py 文件:

def home(request):
    context =  {}
    if request.method == 'POST':
        form = LoginForm(request.POST)
        print('form:', form)
        if form.is_valid():
            print('niceee')
        else:
            return render(request, 'index.html', context)
    else:
        form = LoginForm()

我只想在 views.py 中查看用户名和密码值。但是,我在 views.py 中看不到变量。我该如何解决这个问题?

【问题讨论】:

  • 我认为您并不完全了解 django 工作流程的工作原理......您很可能需要一个与表单相关的模型,因此您可以在数据库中使用该模型。
  • 如果您在 home 函数中捕获 GET 请求并将其显示在您的表单中,您应该将您创建的表单作为上下文变量传递,例如:
    {{form .as_p}}

标签: python django django-views django-forms django-templates


【解决方案1】:
def home(request):

    if request.method == 'POST':
        form = LoginForm(request.POST)
        print('form:', form)
        if form.is_valid():
            print('username:', form.cleaned_data.get('username'))
            print('password:', form.cleaned_data.get('password'))
            print('niceee')

    else:
        form = LoginForm()

    context =  {}
    return render(request, 'index.html', context)

检查服务器的用户名和密码值。

【讨论】:

    【解决方案2】:

    你已经成功了!一旦表单被 Django 验证,您就可以在其cleaned_data 属性中访问表单的变量:

    def home(request):
        context =  {}
        if request.method == 'POST':
            form = LoginForm(request.POST)
            print('form:', form)
            if form.is_valid():
                print('You submitted this username:', form.cleaned_data['username'])
                print('You submitted this password:', form.cleaned_data['password'])
            else:
                return render(request, 'index.html', context)
        else:
            form = LoginForm()
    

    但是,请考虑重用 django.contrib.auth.views.LoginView,因为这样您就不必编写任何 Python 代码了。只需自定义 registration/login.html 模板即可。

    【讨论】:

    • 他没有在他的模板中传递表单(forms.py),所以我认为他应该这样做才能获得数据吗?
    • 您没有必须将表单传递给您的模板,只要您自己呈现正确的&lt;input&gt; 字段即可。
    • 是的,我明白了,但使用表单可能更容易,尤其是使用酷炫的 form.is_valid() 方法来简化数据。另一方面,我认为设置自己的表单比 Django 表单更容易(顺便说一下,我也是 Django 的初学者)
    猜你喜欢
    • 2018-12-19
    • 2018-05-19
    • 2020-03-19
    • 2019-02-16
    • 1970-01-01
    • 2021-08-26
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多