Before I use the design as I mention above, I had thought of using two type 
of profile.
Using two profile model in a project, I need to implement two login page 
for each type of user, and I also need to check which of user is logging in.
I need to implement a custom login_required decorator to protect views, 
maybe called staff_required and normal_user_required.
I need to specify two LOGIN_URL for both type of users.
What is the good way to tell which type of user is logging in? Add a type 
field to User model?
Is it good to put staff user and regular user's username and password in 
same database and same table?

P.S I am a newbie. I ask many question, because I want to know what is the 
best practice for production level project. What are pros and cons of these 
different implementation.

Russell Keith-Magee於 2015年1月28日星期三 UTC+8下午8時27分31秒寫道:
>
>
> On Wed, Jan 28, 2015 at 3:00 PM, 詹上潁 <[email protected] <javascript:>> 
> wrote:
>
>> My project need an admin for staff and a normal website for normal user. 
>> Staff can only login to staffsite and normal user can only login to 
>> website. Staff will login to admin to do some management. They can 
>> view normal user list and detail and create or delete normal user 
>> admin. The two type of user is very different, so I want to write a model 
>> for each of them, instead of using is_staff flag. But in a project, I can 
>> only have a USER_AUTH_MODEL. Is there a good way to implement these 
>> requirements?
>>
>> Since a project can only have a USER_AUTH_MODEL, I separate the two type 
>> of user in two project (staffsite and website).
>> My currently design and implementation is as follow:
>>
>> I wrote a standalone django app called member, and implement Member model
>>
>> class Member(AbstractBaseUser):
>>     #member related fields
>>
>> then I create two project “staffsite" and “website". “staffsite" is for 
>> internal use, “website" is open for normal user. “staffsite" just use the 
>> django built in auth.User. Member model in “staffsite" is just a normal 
>> model. “website" use Member model as USER_AUTH_MODEL.
>> I have two database, one for “staffsite" and one for “website". Since 
>> “staffsite" need to access Member’s data, so I implement a db router for 
>> “staffsite". Whenever I need to access Member’s data in 
>> “staffsite", router will route me to the correct db (You can say that I 
>> use db to link “staffsite” and “website” together.)
>>   member app need to install in both “staffsite" and “website", so I will 
>> have two copy of member app. This is not good for maintenance. Whenever I 
>> change the code in member app, I need to copy and paste to another one. I 
>> extract member app and create a standalone app, and after that I can use 
>> pip install -e  to install member app for both project and I only have to 
>> keep one copy of code.
>>
>> This design is work, but I want to know whether there is a better way to 
>> meet the requirements. 
>>
>
> Yes, this approach will work. It might be the best approach if you really 
> do have 2 completely different sites (even different URLs) that share a 
> little bit of data.
>
> However, if you've got a single site that just has 2 different types of 
> users, an approach that might be easier to manage is write a common "user" 
> model, and then have different profiles for Admin and Normal users. 
>
> This captures the idea that a User isn't something that contains 
> specialised information - it's purely a container to hold a username and 
> password. Once a user has logged in, if there is specialist information 
> needed, then you put that information onto a profile model that has a 
> foreign key to the user model. 
>
> Think of it this way - regardless of whether someone is an staff member or 
> a normal user, they're still a person. The User model should be capturing 
> the fact that they're a person; then, you build other data models to store 
> information about their other roles.
>
> The added advantage of this approach is that a single User can be both an 
> Staff member and a Regular user, as needed - because they have a single 
> User, but 2 different profiles.
>
> I hope this helps.
>
> Yours
> Russ Magee %-)
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/ac4c80e0-ac0d-4217-bf34-9bc97b61069b%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to