2017-08-09 203 views
0

我对Django比较陌生,以前我所做的大部分工作都不需要用户身份验证,所以我对使用这个工具非常陌生。Django - 身份验证

我有两个我自己的模型,一个公司(链接到Django用户)和员工(与公司多对一的关系)。

我想要做的是找出如何创建表单,以便当用户登录时,它可以添加自动连接到与该用户相关的公司的新员工(并且不能将他们连接到其他人课程)。

我已经看过像self.request(用户)这样的东西,但我不确定这将如何工作,因为我尝试使用此表单创建的模型不直接与登录的用户链接。

任何建议或指向具有解决方案的地方将非常感激。

+0

我不太确定你的模型是如何设置的,但可能像'self.request.user.company.employee_set.all()'可能有帮助吗?这将返回该用户所属公司的所有员工 – RHSmith159

+0

这可能有助于https://simpleisbetterthancomplex.com/tutorial/2016/06/27/how-to-use-djangos-built-in-login-system。 html – mbieren

+0

嗨@RHSmith,是的,我设法使用了Mozille Django教程中的类似方法,这样我就可以查看来自用户的所有连接到公司的员工。然而,我不确定如何使用新员工表单来确保公司只能被自动设置为已登录的用户。 – Nowandthen98

回答

1

不知道你的模型是如何设置太多。这可以帮助:

登录形式:

from django import forms 

class LoginForm(forms.Form): 

    username = forms.CharField(required = True) 
    password = forms.CharField(required = True) 

你登录查看:

from .forms import LoginForm 
from django.contrib.auth import authenticate 

def login_view(request): 

    if request.method == "POST": 

     login_form = LoginForm(request.POST) 

     if login_form.is_valid(): 

      cleaned_username = login_form.cleaned_data["username"] 
      cleaned_password = login_form.cleaned_data["password"] 

      user = authenticate(username = cleaned_username, password = cleaned_password) 

      # It might be worth putting the form processing into a method of the login form. 


      if user: 

       login(user) 

       return redirect("url_for_my_company_page") 

      else: 

       pass # user failed auth, send message back to user 

     else: 

      pass # form not valid, handle errors 

     else: 

      login_form = LoginForm() 


    return render(request, "template.html", {"login_form":login_form} 

现在,当用户成功登录,他们将被重定向到他们公司的网页。这意味着当您使用request.user时,您将获得经过身份验证的用户。 (否则,我认为它会返回一个'AnonymousUser')。

贵公司查看:

def my_company_view(request): 

    user_company = request.user.company 

    # here you can put in your new_employee form 
    # the user_company can now be used 


    return render(request, "template.html", {"company": user_company} 

如果你正在使用你的新员工形式的模型的形式(models.ModelForm),我想你可以通过构造函数添加变量到窗体:

class NewEmployeeForm(forms.ModelForm): 
    def __init__(self, company, *args, **kwargs): 
     self.company = company 
     super(NewEmployeeForm, self).__init__(*args, **kwargs) 
     self.fields['company'].initial = company 

    class Meta: 
     model = Employee 
     #fields... 

    def save(self): 
     Employee.objects.create(company = self.company) 

如果您仅使用通用表格(forms.Form),则只需使用user_company变量即可设置员工的公司。

希望这会有所帮助!