2009-12-08 2 views
0

В моем приложении у меня есть модели, которые имеют модель Users в качестве внешнего ключа, например:Назначение группы при добавлении пользователя в Django-админ

class Doctor(models.Model):  
username=models.ForeignKey(User, unique=True) 
... 

на сайте администратора, при добавлении нового доктора, У меня есть возможность добавить нового пользователя рядом с полем имени пользователя. Это именно то, что я хочу, но в открывшемся диалоговом окне он запрашивает имя пользователя и пароль для нового пользователя; Я также хотел бы иметь возможность назначить группу этому новому пользователю. Какой был бы лучший способ сделать это?

Спасибо, lokharkey

ответ

2

В приложении создать «admin.py», где вы на самом деле зарегистрировать свою собственную модель для администратора, добавить следующий код.

from django.contrib.auth.models import User 
from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.forms import UserCreationForm 

class MyUserCreationForm(UserCreationForm): 
    """ 
    A form that overrides the UserCreationForm 
    """ 
    class Meta: 
     model = User 
     fields = ("username", "groups") 

UserAdmin.add_form = MyUserCreationForm 

admin.site.register(Doctor) 

Теперь вам просто нужно переопределить шаблон, который отображает эту переопределенную форму. Создайте структуру каталогов, как,

"your_project_root_directory"/templates/admin/auth/user/add_form.html 

и скопировать содержимое в виде,

{% extends "admin/change_form.html" %} 
{% load i18n %} 

{% block after_field_sets %} 

<p>{% trans "First, enter a username and password. Then, you'll be able to edit more user options." %}</p> 

<fieldset class="module aligned"> 

<div class="form-row"> 
    {{ form.username.errors }} 
    {# TODO: get required class on label_tag #} 
    <label for="id_username" class="required">{% trans 'Username' %}:</label> {{ form.username }} 
    <p class="help">{{ form.username.help_text }}</p> 
</div> 

<div class="form-row"> 
    {{ form.password1.errors }} 
    {# TODO: get required class on label_tag #} 
    <label for="id_password1" class="required">{% trans 'Password' %}:</label> {{ form.password1 }} 
</div> 

<div class="form-row"> 
    {{ form.password2.errors }} 
    {# TODO: get required class on label_tag #} 
    <label for="id_password2" class="required">{% trans 'Password (again)' %}:</label> {{ form.password2 }} 
    <p class="help">{% trans 'Enter the same password as above, for verification.' %}</p> 
</div> 

<div class="form-row"> 
    {{ form.groups.errors }} 
    {# TODO: get required class on label_tag #} 
    <label for="id_groups" class="required">{% trans 'Groups' %}:</label> {{ form.groups }} 
    <p class="help">{% trans 'All existing Groups listed here. If you are not seeing any group, means you dont have any groups object created.' %}</p> 
</div> 

<script type="text/javascript">document.getElementById("id_username").focus();</script> 

</fieldset> 
{% endblock %} 

И вы хорошо идти. Его рабочий фрагмент.

0

Просто из любопытства, этот тип решения считается кошерным в Django? То есть, похоже, копирование/вставка большого фрагмента кода, как это происходит против принципа DRY, который разработчики Django рекламируют.

+1

DRY - это очень хорошая практика, когда это возможно - иногда тонкая настройка требует решения против такой практики – Alvin