''TypeError at /user expected string or bytes-like object'' при отправке for в 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 = models.AutoField()
    # ⋮

что касается поля date, вы можете работать с auto_now_add=True [Django-doc] для автоматического заполнения текущего дня:

class staff(models.Model):
    # ⋮
    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=… ↓
        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 для проверки, очистки и заполнения данных из POST запроса.


Примечание: В случае успешного POST запроса, вы должны сделать redirect. [Django-doc] для реализации паттерна Post/Redirect/Get [wiki]. Это позволяет избежать повторения POST-запроса, когда пользователь обновляет браузер. браузер.


Примечание: Модели в Django пишутся в PascalCase, а не snake_case, поэтому вы можете переименовать модель из staff в Staff.

Вернуться на верх