2017-08-09 201 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變量即可設置員工的公司。

希望這會有所幫助!