首页 > 解决方案 > 我想以当前登录用户作为申请人附加我的表格

问题描述

我是 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 %}

我希望用户看到休假类型的下拉列表并将其提交以供批准,而不会看到任何与选择用户等相关的字段。

标签: pythondjangodjango-forms

解决方案


您的模型对员工有一个外键,而不是用户。request.user是 User,它本身与 Employee 是一对一的关系。您应该遵循这种关系:

abc.employee_leaves = request.user.employee

推荐阅读