form.is_valid() 没有按预期工作 django
form.is_valid() not working as intended django
我是 django 的新手,我正在尝试制作一个考勤系统,用户可以在其中输入他们的姓名并按下打卡或打卡,但是当我测试代码时。但是每当我输入一个名字并按下时钟时,它不会将名字和时间保存到数据库中。
views.py:
def home(response):
form = CreateNewList()
empName = employeeName.objects.all
if response.method == "POST":
form = CreateNewList(response.POST)
if 'clockIn' in response.POST:
if form.is_valid():
n = form.cleaned_data["name"]
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
t = Name(name = n, timeIn=current_time)
t.save()
return redirect('/')
else:
form = CreateNewList()
return render(response, "main/home.html", context={"form":form, "empName":empName})
models.py:
class employeeName(models.Model):
employee = models.CharField(max_length=200)
total_Hours_Worked = models.CharField(max_length=8, default="Empty")
def __str__(self):
return self.employee
class Name(models.Model):
name = models.ForeignKey(employeeName, null=True,on_delete=models.CASCADE)
timeIn = models.TimeField()
timeOut = models.TimeField(default=datetime.now())
date = models.DateField(auto_now=True)
def __str__(self):
return str(self.name)
forms.py:
class CreateNewList(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CreateNewList, self).__init__(*args, **kwargs)
self.fields['name'].widget = TextInput()
class Meta:
model = Name
fields = ['name']
home.html:
<form method="post">
{% csrf_token %}
<div class="input-group mb-2">
<div class="input-group-prepend">
<h3 class="p2" >Clock In/Clock Out</h3>
<label>Enter Your Full Name:</label>
{{form.name}}
<datalist id="attendance">
{% for empName in empName %}
<option value="{{empName.employee}}">
{% endfor %}
</datalist>
<button type="submit" name="clockIn" value="clockIn" class="btn btn-outline-primary">Clock In</button>
<button type="submit" name="clockOut" value="clockOut" class="btn btn-outline-primary">Clock Out</button>
</div>
</div>
</form>
每当我按下 clockIn 按钮在终端中打印一些东西时,我都尝试过测试,但从未打印过任何东西。我不明白我的代码有什么问题
您遇到的问题是 Name
模型中的 name
是 employeeName
模型的外键。在您的表单中,您已将 name
字段的小部件更改为 TextInput
。 Django 在创建 Name
对象时需要一个 employeeName
对象,而不是字符串。您应该将小部件保留为默认模型 select,这样用户将 select 他们的名字而不是键入它。否则,您将不得不实现变得更加复杂的搜索功能。如果用户拼错了他的名字怎么办?你如何通知用户这个?他们如何确认 employeeName
对象是正确的?
我是 django 的新手,我正在尝试制作一个考勤系统,用户可以在其中输入他们的姓名并按下打卡或打卡,但是当我测试代码时。但是每当我输入一个名字并按下时钟时,它不会将名字和时间保存到数据库中。
views.py:
def home(response):
form = CreateNewList()
empName = employeeName.objects.all
if response.method == "POST":
form = CreateNewList(response.POST)
if 'clockIn' in response.POST:
if form.is_valid():
n = form.cleaned_data["name"]
now = datetime.now()
current_time = now.strftime("%H:%M:%S")
t = Name(name = n, timeIn=current_time)
t.save()
return redirect('/')
else:
form = CreateNewList()
return render(response, "main/home.html", context={"form":form, "empName":empName})
models.py:
class employeeName(models.Model):
employee = models.CharField(max_length=200)
total_Hours_Worked = models.CharField(max_length=8, default="Empty")
def __str__(self):
return self.employee
class Name(models.Model):
name = models.ForeignKey(employeeName, null=True,on_delete=models.CASCADE)
timeIn = models.TimeField()
timeOut = models.TimeField(default=datetime.now())
date = models.DateField(auto_now=True)
def __str__(self):
return str(self.name)
forms.py:
class CreateNewList(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(CreateNewList, self).__init__(*args, **kwargs)
self.fields['name'].widget = TextInput()
class Meta:
model = Name
fields = ['name']
home.html:
<form method="post">
{% csrf_token %}
<div class="input-group mb-2">
<div class="input-group-prepend">
<h3 class="p2" >Clock In/Clock Out</h3>
<label>Enter Your Full Name:</label>
{{form.name}}
<datalist id="attendance">
{% for empName in empName %}
<option value="{{empName.employee}}">
{% endfor %}
</datalist>
<button type="submit" name="clockIn" value="clockIn" class="btn btn-outline-primary">Clock In</button>
<button type="submit" name="clockOut" value="clockOut" class="btn btn-outline-primary">Clock Out</button>
</div>
</div>
</form>
每当我按下 clockIn 按钮在终端中打印一些东西时,我都尝试过测试,但从未打印过任何东西。我不明白我的代码有什么问题
您遇到的问题是 Name
模型中的 name
是 employeeName
模型的外键。在您的表单中,您已将 name
字段的小部件更改为 TextInput
。 Django 在创建 Name
对象时需要一个 employeeName
对象,而不是字符串。您应该将小部件保留为默认模型 select,这样用户将 select 他们的名字而不是键入它。否则,您将不得不实现变得更加复杂的搜索功能。如果用户拼错了他的名字怎么办?你如何通知用户这个?他们如何确认 employeeName
对象是正确的?