python - 我想以当前登录用户作为申请人附加我的表格
问题描述
我是 Django 的新手,仍在学习,现在我正在 Django 中制作 LMS,我有一个表格申请以当前登录用户作为申请人的休假。但我不明白我怎么能默认做到这一点。如果我让用户这样做,那么可以达到预期的结果,但我不希望用户看到该字段。
我尝试通过视图排除和传递用户,但我做不到。
更新
这是错误
Cannot assign "<SimpleLazyObject: <User: superman>>": "Leave.employee_leaves" must be a "Employee" instance.
Django Version: 1.11.20
Exception Type: ValueError
Exception Value:
Cannot assign "<SimpleLazyObject: <User: superman>>": "Leave.employee_leaves" must be a "Employee" instance.
Exception Location: C:\Python27\lib\site-packages\django\db\models\fields\related_descriptors.py in __set__, line 216
Python Executable: C:\Python27\python.exe
Python Version: 2.7.16
Python Path:
['C:\\Users\\User\\Desktop\\Intern Work\\LMS\\LMS',
'C:\\Python27\\python27.zip',
'C:\\Python27\\DLLs',
'C:\\Python27\\lib',
'C:\\Python27\\lib\\plat-win',
'C:\\Python27\\lib\\lib-tk',
'C:\\Python27',
'C:\\Users\\Bitswits 3\\AppData\\Roaming\\Python\\Python27\\site-packages',
'C:\\Python27\\lib\\site-packages']
Server time: Fri, 17 May 2019 10:02:36 +0000
**traceback**
Internal Server Error: /request/
Traceback (most recent call last):
File "C:\Python27\lib\site-packages\django\core\handlers\exception.py", line 41, in inner
response = get_response(request)
表格.py
from .models import Employee, Leave
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
class Leave_Form(forms.ModelForm):
class Meta:
model = Leave
fields = ['leave_Type', 'employee_leaves']
# exclude = ['employee_leaves']
leave_type_choice = (
("Annual leave", "Annual leave"),
("Sick leave", "Sick leave"),
("Casual leave", "Casual leave"),
("Emergency leave", "Emergency leave"),)
widgets = {
'leave_Type': forms.Select(choices=leave_type_choice, attrs={'class': 'form-control'}), }
class RegistrationForm(UserCreationForm):
email = forms.EmailField(required=True)
class Meta:
model = User
fields = [
'username',
'first_name',
'last_name',
'email',
'password1',
'password2'
]
def save(self, commit=True):
user = super(RegistrationForm, self).save(commit=False)
user.first_name = self.cleaned_data['first_name']
user.last_name = self.cleaned_data['last_name']
user.email = self.cleaned_data['email']
if commit:
user.save()
return user
class userReg_Form(forms.ModelForm):
class Meta:
model = Employee
exclude = ['employee_name']
fields = [
'employee_designation', 'employee_department', ]
employee_department_type = (
("Admin", "Admin"),
("Finance", "Finance"),
("General Staff", "General Staff"),
("H.R", "H.R"),
("I.T", "I.T"),
("Software Development", "Software Development"), )
widgets={
'employee_department': forms.Select(choices=employee_department_type, attrs={'class': 'form-control'}), }
模型.py
from __future__ import unicode_literals
from django.db import models
from django.contrib.auth.models import User
class Employee(models.Model):
employee_name = models.OneToOneField(User, on_delete = models.CASCADE)
employee_designation = models.CharField(max_length = 10)
employee_department = models.CharField(max_length = 35)
def __str__(self):
return self.employee_department + " " + " " + str(self.employee_name.username) + " " + " " + " ID: " + str(self.pk)
class Meta:
verbose_name_plural = "Employee"
class Leave(models.Model):
#This class will connect the user with the leave types etc and other classes data
employee_leaves = models.ForeignKey(
Employee, on_delete=models.CASCADE)
leave_Type = models.CharField(max_length=25)
class Meta:
verbose_name_plural = "Leave"
def __str__(self):
return self.leave_Type + " by " + str(self.employee_leaves)
视图.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from .forms import Leave_Form, RegistrationForm, userReg_Form # Form Name
from . models import *
from django.shortcuts import render, redirect, render_to_response
from django.contrib import messages
from django.contrib.auth import login, logout, authenticate, update_session_auth_hash
from django.contrib.auth.forms import PasswordChangeForm, UserCreationForm
from django.http import HttpResponseRedirect, JsonResponse
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
def home(request): # To view contents of the home page
return render(request, "projectfiles/HomePage.html")
The form view
#Requesting leave
@login_required(login_url='LoginPage')
def request_leave(request):
form = Leave_Form(request.POST or None)
if form.is_valid():
# abc = form.save(commit=False)
# abc.employee_leaves = request.user
# abc.save()
form.save()
context = {'form': form}
# messages.success(request, ('Submitted for review!'))
# return HttpResponseRedirect('Home-Page')
return render(request, 'projectfiles/reqleave.html', context)
#shows the signed up users to the admin
@login_required(login_url='LoginPage')
def showusers(request):
users = User.objects.all()
context={'users':users}
return render(request, 'projectfiles/showusers.html', context)
#User password change
@login_required(login_url='LoginPage')
def change_password(request):
if request.method == 'POST':
form = PasswordChangeForm(request.user, request.POST)
if form.is_valid():
user = form.save()
update_session_auth_hash(request, user)
messages.success(request,('Password updated!'))
return redirect('Home-Page')
else:
messages.error(request,('Please correct the error below.'))
else:
form = PasswordChangeForm(request.user)
return render(request, 'projectfiles/change_password.html', {'form': form})
#User registration with dept and designation
def reg_user(request):
form = RegistrationForm(request.POST)
form2 = userReg_Form(request.POST)
if request.method == 'POST':
if form.is_valid() and form2.is_valid():
user = form.save()
profile = form2.save(commit=False)
profile.employee_name = user
profile.save()
return redirect('Home-Page')
else:
form = RegistrationForm()
form2 = userReg_Form()
context = {'form': form, 'form2': form2}
return render(request, 'projectfiles/reg.html', context)
reqleave.html
{% include 'projectfiles/base.html' %}
<title>Request Leave</title>`
{% block asd %}
<br><br>
<div class="container" align="center">
<form method="POST" style="width:190px">
{% csrf_token %}
{{form.as_p}}
<button class="btn btn-success my-2 my-sm-0" type="submit">Apply</button>
</form></div>
{% endblock %}
我希望用户看到休假类型的下拉列表并将其提交以供批准,而不会看到任何与选择用户等相关的字段。
解决方案
您的模型对员工有一个外键,而不是用户。request.user
是 User,它本身与 Employee 是一对一的关系。您应该遵循这种关系:
abc.employee_leaves = request.user.employee
推荐阅读
- php - $row 将在此返回什么
- regex - 我如何将变量多行 perl 正则表达式与不同的规则匹配
- c# - 如何有条件地从 ASP.NET Core 注册中删除控制器并添加到 ServiceCollection
- python - 熊猫:按组插入一个空白行和一个带索引的行?
- azure - Azure Powershell - 无法将子网设置添加到数据库
- c - 当某个条件为假时如何打破while循环
- html - Bootstrap 4 - 将 div 垂直对齐到列的底部
- java - 如果互联网速度慢并且我不知道要下载的文件大小,如何设置 connectTimeout
- ajax - 在laravel中获取php标签作为前缀的Ajax响应
- javascript - 如何使用 HTML 文件制作 iframe