【问题标题】:How do I use 'Django Forms' to process user input?如何使用“Django Forms”处理用户输入?
【发布时间】:2020-07-30 22:44:16
【问题描述】:

我正在创建一种仪表板,当它完成后,将允许用户 (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)

【问题讨论】:

  • 确保输入元素内的名称属性与该输入通知的字段名称相同。

标签: django django-rest-framework django-forms user-input crud


【解决方案1】:

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

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

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

form=edit_name()

然后在您的上下文中,添加'form': form 这样,在您的 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、渲染或响应。

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

【讨论】:

    猜你喜欢
    • 2016-11-27
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多