首页 > 解决方案 > 如何使用“Django Forms”处理用户输入?

问题描述

我正在创建一种仪表板,当它完成后,将允许用户(1)上传个人资料图片,(2)为自己输入一个显示名称,以及(3)编辑和更改他们的个人资料图片以及他们的显示名称他们应该愿意吗?

https://github.com/pmahalan/Avybe_Database_Project

我已经构建了前端(模板和视图),并且构建了模型。我将模型标记为“创建者”,就像在内容创建者中一样 - 与之关联的两个对象是“名称”(对应于他们的显示名称)和“上传”(对应于他们的图片)。

我还有与提交和上传按钮相关联的 URL 路径,单击时会起作用。

但是,在输入新用户名或上传新图片后单击提交实际上并不会更改此人的信息。如果我个人通过 Django Admin 进行更改,我可以更改信息,仅此而已。我希望前端用户能够通过他们的输入以及当他们单击“提交”按钮时有效地更改它。

我是否在我的 views.py 文件中创建 Django?我是创建两个单独的表单(一个用于显示名称,一个用于个人资料图片),还是只创建一个?从那里,我如何将它传递给我的模板?是否需要一个“if”语句来查看它是 POST 还是 GET 请求?

我的意见.py:

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
from .models import *

def home(request):
    creators = Creator.objects.all()
    return render(request, 'accounts/dashboard.html', {'creators': creators})

def changeName(request):
    context = {}
    return render(request, 'accounts/dashboard.html', context)

def uploadPic(request):
    context = {}
    return render(request, 'accounts/dashboard.html', context)

我的 urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.home),
    path('update_name/', views.changeName, name="update_name"),
    path('upload_pic/', views.uploadPic, name="upload_pic"),
]

我的模板(dashboard.html):

<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
  <meta charset="utf-8">
  <title>Avybe Creator Dashboard</title>
</head>
<body>

  <p class="row" style="padding-left: 60px;"> &nbsp; </p>
  <!-- Deliberatley empty space -->

    <h1 class="row" style="padding-left: 60px;">Welcome to your Avybe Creator Dashboard!</h1>

    <p class="row" style="padding-left: 60px;"> &nbsp; </p>
    <!-- Deliberatley empty space -->

    <form action="" method="POST" class="row" style="padding-left: 60px;" enctype="multipart/form-data">
      {% csrf_token %}
      Upload a Profile Picture: &nbsp;
      <input type="file" name="fileToUpload" id="fileToUpload">
      <input type="submit" value="Upload Image" name="submit" href="{% url 'upload_pic' %}">
    </form>

    <p class="row"> &nbsp; </p>
    <!-- Deliberatley empty space -->

    <p class="row" style="padding-left: 60px;">Your current displayname is: 
      {% for i in creators %}
          {{i.name}}
      {% endfor %}
    </p>

    <p class="row" style="padding-left: 60px;"> &nbsp; </p>
    <!-- Deliberatley empty space -->

      <form action="" method="POST" class="row" style="padding-left: 60px;">
          {% csrf_token %}
          <label for="publicname">Edit your displayname: &nbsp; </label>
          <input type="text" id="publicname" name="publicname" value="ExampleName">
          <input type="submit" value="Submit" href="{% url 'update_name' %}"> 
        </form> 
  

</body>
</html>

我的模型:

from django.db import models

# Create your models here.

class Creator(models.Model):
    name = models.CharField(max_length=200, null=True)
    upload = models.ImageField(blank=True, null=True)

标签: djangodjango-rest-frameworkdjango-formsuser-inputcrud

解决方案


诚然,我也是 Django 的新手,但不是用输入字段自己制作表单,Django 有自己的制作表单的方式,我会推荐。为了使用 Django 制作表单,您必须创建一个新类,例如:

class edit_name(forms.Form):
    new_name = forms.CharField(label="Enter Your New Name")

然后,在您的 views.home 函数中(或任何您想要表单的地方),您可以添加一行生成空白表单,如下所示:

form=edit_name()

然后在您的上下文中,将'form': form That way 添加到您的 HTML 文件中,而不是编写所有输入,您只需要做{{ form }},Django 会自动为您生成表单。现在,为了接收此表单提供的数据,您可以将此代码添加到正在处理 POST 请求的视图函数中,在您的情况下,它是 update_name (仅关注一个表单)。

if request.method == 'POST':
        form = edit_name(request.POST)
        if form.is_valid():
            title = form.cleaned_data['new_name']

现在,您有了带有输入数据的标题变量,您现在可以对它做任何您想做的事情,比如编辑某个文件,然后返回一个 httpredirect、渲染或响应。

希望这有帮助!PS 如果我的代码有任何错误,我很抱歉,正如我所说的,我自己有点 Django 菜鸟。另外,很抱歉,如果我错过了一步,为了更彻底地了解表单和 Django,我会推荐这个讲座。


推荐阅读