【问题标题】:''TypeError at /user expected string or bytes-like object'' on submitting the for in django?''TypeError at /user expected string or bytes-like object''在django中提交for?
【发布时间】:2021-08-28 17:42:11
【问题描述】:

当我在 django 中提交表单时,它会给出错误“TypeError at /user expected string or bytes-like object”。

这是我的员工模型

class staff(models.Model):
    id = models.AutoField
    name = models.CharField(max_length=250)
    role = models.CharField(max_length=250)
    salary = models.CharField(max_length=250)
    address = models.CharField(max_length=250)
    number = models.CharField(max_length=250)
    date = models.DateField()

这是我的用户视图。

def user(request):
    if request.method == "POST" :
        name = request.POST['name']
        role = request.POST['role']
        salary = request.POST['salary']
        address = request.POST['address']
        number = request.POST['number']
        date = DateTimeField()

        ins = staff(name=name, role=role, salary=salary, address=address, date=date, number=number)
        ins.save()
    staffs = staff.objects.all()
    return render(request, "salary/user.html", {'staff': staffs})

这是模板user.html的形式

<form class="forms-sample" action="/user" method="post">
                            {% csrf_token %}
                            <div class="form-group row">
                                <label for="exampleInputUsername2" class="col-sm-3 col-form-label">Name:</label>
                                <div class="col-sm-9">
                                    <input type="text" name="name" id="name" class="form-control" id="exampleInputUsername2" placeholder="Username">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="exampleInputUsername2" class="col-sm-3 col-form-label">Role:</label>
                                <div class="col-sm-9">
                                    <input type="text" name="role" id="role" class="form-control" id="exampleInputUsername2" placeholder="Role">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="exampleInputUsername2" class="col-sm-3 col-form-label">Salary:</label>
                                <div class="col-sm-9">
                                    <input type="text" name="salary" id="salary" class="form-control" id="exampleInputUsername2" placeholder="Salary">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="exampleInputUsername2" class="col-sm-3 col-form-label">Address:</label>
                                <div class="col-sm-9">
                                    <input type="text" name="address" id="address" class="form-control" id="exampleInputUsername2" placeholder="Address">
                                </div>
                            </div>
                            <div class="form-group row">
                                <label for="exampleInputUsername2" class="col-sm-3 col-form-label">Mobile no.:</label>
                                <div class="col-sm-9">
                                    <input type="text" name="number" id="number" class="form-control" id="exampleInputUsername2" placeholder="Mobile no.">
                                </div>
                            </div>
                           
                            <button type="submit" class="btn btn-primary mr-2">Submit</button>
                            <button class="btn btn-dark">Cancel</button>
                        </form>

我是 django 新手,我不知道问题是什么。

感谢您提前提供帮助。

【问题讨论】:

  • date = DateTimeField() 没有意义,您应该从 request.POST 数据中解析它,或者使用 Django 表单将其转换为有效的 date 对象。
  • 我该怎么做
  • 您要填写当前日期吗?
  • 是的,我想填写当前日期

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


【解决方案1】:

在你的模型中传递对AutoField模型字段的引用是没有意义的,你应该构造一个字段,所以:

class staff(models.Model):
    id = models.AutoField()
    # &vellip;

date字段,可以配合auto_now_add=True [Django-doc]自动填写当天:

class staff(models.Model):
    # &vellip;
    date = models.DateField(auto_now_add=True)

那么在构造staff 对象时可以省略它:

def user(request):
    if request.method == "POST" :
        name = request.POST['name']
        role = request.POST['role']
        salary = request.POST['salary']
        address = request.POST['address']
        number = request.POST['number']

        #           no date=… &downarrow;
        ins = staff.objects.create(name=name, role=role, salary=salary, address=address, number=number)
        ins.save()
    staffs = staff.objects.all()
    return render(request, "salary/user.html", {'staff': staffs})

不过,最好使用Django forms 来验证、清理和填充来自 POST 请求的数据。


注意:如果 POST 请求成功,您应该发送redirect [Django-doc] 实施Post/Redirect/Get pattern [wiki]。 这样可以避免在用户刷新时发出相同的 POST 请求 浏览器。


注意:Django 中的模型是用 PascalCase 编写的,而不是 snake_case, 所以您可能想将模型从 staff 重命名为 Staff。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2018-05-29
    • 2016-10-27
    • 1970-01-01
    相关资源
    最近更新 更多