''TypeError at /user expected string or bytes-like object'' 在 Django 中提交 for?

''TypeError at /user expected string or bytes-like object'' on submitting the for in django?

当我在 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 的新手,我不知道问题是什么。

感谢您的提前帮助。

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

class staff(models.Model):
    id = <strong>models.AutoField()</strong>
    # ⋮

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

class staff(models.Model):
    # ⋮
    date = models.DateField(<strong>auto_now_add=True</strong>)

那么在构建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=… ↓
        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 请求的数据可能会更好。


Note: In case of a successful POST request, you should make a redirect [Django-doc] to implement the Post/Redirect/Get pattern [wiki]. This avoids that you make the same POST request when the user refreshes the browser.


Note: Models in Django are written in PascalCase, not snake_case, so you might want to rename the model from staff to Staff.