2017-08-09 8 views
0

私は比較的新しいDjangoです。以前に行ったことのほとんどはユーザ認証が不要なので、特にこれで作業するのは初めてです。Django - フォームでの認証

私は自分のモデル、会社(djangoユーザーにリンクされている)、従業員(企業と多対1の関係)の2つを持っています。

私がしたいことは、ユーザーがログインしたときに、そのユーザーに関連して自動的に会社に縛られた新しい従業員を追加できるようにフォームを作成する方法を見つけることです。コース)。

self.request(user)のようなものを見たことがありますが、このフォームで作成しようとしているモデルがログインしているユーザーに直接リンクされていないため、これがどのように機能するのかわかりません。

解決策がある場所に向かうアドバイスや参考になるものがあれば幸いです。

+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のチュートリアルと同様の方法でユーザーを管理していますので、ユーザーから会社に縛られたすべての従業員を見ることができます。しかし、新しい従業員のフォームを使用して、会社が唯一のものであることと、自動的にログインしているユーザーの1人として設定されていることを確認するのは不確かです。 – 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'を返します)。

あなたの会社ビュー:

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) 

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)を使用している場合、私はあなたがコンストラクタでフォームに変数を追加することができると思います

汎用フォーム(forms.Form)だけを使用している場合は、user_company変数を使用して従業員の会社を設定することができます。

希望すると便利です。