Frage

Ich habe kürzlich damit begonnen, Django zu verwenden, um eine große vorhandene Anwendung zu verwalten, die im Laufe der Jahre mit Twisted.Web organisch angebaut wurde. Ich begann mit Django zu experimentieren und es ist eine automatische Administratoroberfläche und war sehr zufrieden mit den Ergebnissen.

Eine Sache, die für meine Zwecke zu fehlen scheint, ist die Möglichkeit, Benutzern nur Zugriff auf Daten zu erhalten. Zum Beispiel haben wir eine Rolle, bei der sich Menschen anmelden und Bestellungen erstellen dürfen. Sie müssen auch in der Lage sein, andere Client- oder Produktdaten zu bearbeiten, aber nicht bearbeiten.

Wie würde ich "Ansicht" -Träger im Django -Administrator erstellen, damit Benutzer Daten für einige Tabellen ändern können und gleichzeitig nur Zugriff auf andere gelesen haben?

UPDATE: Django admin scheint mir die CUD einer Crud -Schnittstelle zu geben. Wie bekomme ich den einzigen Teil mit den damit verbundenen Berechtigungen und Gruppen?

Update 2010-Feb-12: Django 1.2 wird nun schreibgeschützt enthalten. Details unten.


Ich habe meine eigene Frage beantwortet, denke ich. Verschieben Sie den Inhalt auf eine echte Antwort unten.

War es hilfreich?

Lösung 5

Die Möglichkeit, der Admin-Ansicht schreibgeschützte Felder hinzuzufügen, ist jetzt in Django Version 1.2 enthalten.

Siehe Ticketnummer 342http://code.djangoproject.com/ticket/342

Siehe Änderungenset -Nummer 11965http://code.djangoproject.com/changeset/11965

Siehe Dokumentationhttp://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.modeladmin.readonly_fields

Andere Tipps

So habe ich Django 1.0.2 geändert, um die Ansichtsberechtigungen hinzuzufügen. Entschuldigung, es ist kein Diff verfügbar.

X] 1. Hinzufügen von 'Ansicht' zur Standardberechtigungsliste hinzugefügt

#./contrib/auth/management/__init__.py
def _get_all_permissions(opts):
    "Returns (codename, name) for all permissions in the given opts."
    perms = []
    for action in ('add', 'change', 'delete', 'view'):
        perms.append((_get_permission_codename(action, opts), u'Can %s %s' % (action, opts.verbose_name_raw)))
    return perms + list(opts.permissions)

X] 2. Testen Sie die Berechtigung "Ansicht", zu allen Modellen hinzugefügt wird

run manage.py syncdb

Ich habe bestätigt, dass die Ansichtserlaubnis jetzt für alle Tabellen in der Tabelle auth_permissions hinzugefügt wird

X] 3. Fügen Sie "get_view_permission" zur Standardmodellklasse hinzu.

Get_view_permission zur Modellklasse hinzugefügt. Sie finden dies in der Datei ./db/models/options.py Dies wird von der Administratorklasse im nächsten Schritt verwendet.

def get_view_permission(self):
    return 'view_%s' % self.object_name.lower()

X] 4. Hinzufügen "HAS_View_permission" zur Standardadministratorklasse

Nur um konsequent zu sein, werde ich dem System "Has_view_permission" hinzufügen. Sieht so aus, als ob es irgendwo in sein sollte Beitrag/admin/options.py. Stellen Sie sicher, dass der Benutzer, wenn der Benutzer Änderungsgenehmigungen verfügt, automatisch impliziert werden.

# /contrib/admin/options.py
# Added has_view_permissions
def has_view_permission(self, request, obj=None):
    """
    Returns True if the given request has permission to change or view
    the given Django model instance.

    If `obj` is None, this should return True if the given request has
    permission to change *any* object of the given type.
    """
    opts = self.opts
    return self.has_change_permission(request, obj) or \
        request.user.has_perm(opts.app_label + '.' + opts.get_view_permission())

# modified get_model_perms to include 'view' too.
# No idea where this may be used, but trying to stay consistent
def get_model_perms(self, request):
        """
        Returns a dict of all perms for this model. This dict has the keys
        ``add``, ``change``, and ``delete`` and ``view`` mapping to the True/False
        for each of those actions.
        """
        return {
            'add': self.has_add_permission(request),
            'change': self.has_change_permission(request),
            'delete': self.has_delete_permission(request),
            'view': self.has_view_permission(request),
        }

# modified response_add function to return the user to the mode list
# if they added a unit and have view rights
... 
    else:
        self.message_user(request, msg)

        # Figure out where to redirect. If the user has change permission,
        # redirect to the change-list page for this object. Otherwise,
        # redirect to the admin index.
        #if self.has_change_permission(request, None):
        if self.has_change_permission(request, None) or self.has_view_permission(request, None):
            post_url = '../'
        else:
            post_url = '../../../'
        return HttpResponseRedirect(post_url)

 # modified the change_view function so it becomes the details 
 # for users with view permission

    #if not self.has_change_permission(request, obj):
    if not (self.has_change_permission(request, obj) or (self.has_view_permission(request, obj) and not request.POST)):
        raise PermissionDenied


  # modified the changelist_view function so it shows the list of items
  # if you have view permissions
def changelist_view(self, request, extra_context=None):
    "The 'change list' admin view for this model."
    from django.contrib.admin.views.main import ChangeList, ERROR_FLAG
    opts = self.model._meta
    app_label = opts.app_label
    #if not self.has_change_permission(request, None):
    if not (self.has_change_permission(request, None) or self.has_view_permission(request, None)):
        raise PermissionDenied

X] 5. Aktualisieren Sie die Standardvorlage in Listenmodelle, wenn der Benutzer die Berechtigung zur Ansicht hat

Ich habe die Standardvorlage in Beitrag/admin/templates/admin/index.html geändert. Dies könnte auch behandelt werden, indem die Datei stattdessen in das lokale Vorlagenverzeichnis kopiert wird. Ich habe Änderungen in beiden vorgenommen, also habe ich eine Kopie, wenn ein späteres Upgrade meine Änderungen überschreibt.

 {% for model in app.models %}
            <tr>
            {% if model.perms.change %}
                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
            {% else %}
                {% if model.perms.view %}
                    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
                {% else %}
                    <th scope="row">{{ model.name }}</th>
                {% endif %}
            {% endif %}

X] 6. Bestätigen Sie, dass der Benutzer das Modell "anzeigen", aber nicht "ändern" kann

Found drab/admin/templatetags/admin_modify.py scheint zu steuern, um speichern/speichern und fortzusetzen, dass Schaltflächen angezeigt werden oder nicht. Das Feld "Speichern" von Standard von Always True geändert, um nach Kontext und Berechtigungen zu überprüfen. Der Benutzer sollte in der Lage sein zu sparen, wenn er Änderungen oder Berechtigungen hinzufügt.

 'show_save': (change and context['has_change_permission']) or (context['add'] and context['has_add_permission'])

X] 7. Entfernen Sie die Schaltfläche "Speichern und hinzufügen", wenn der Benutzer ein Element anzeigt

Modifizierte Beitrag/admin/templatetags/admin_modify.py erneut. Ich weiß nicht, was 'Save_as' bedeutet, also habe ich vielleicht etwas gebrochen, aber es scheint zu funktionieren.

    #'show_save_and_add_another': context['has_add_permission'] and
    #                    not is_popup and (not save_as or context['add']) ,
    'show_save_and_add_another': not is_popup and
        (( change and context['has_change_permission']) or (context['add'] and context['has_add_permission']))
        and
        (not save_as or context['add']),

X] 8. Ändern Sie die Berechtigung "Ansicht", nur das Formular zu ermitteln

Wenn der Benutzer die Berechtigung "anzeigen" und die Berechtigung "ändern" hat, dann tun Sie nichts. Überschreibungsansicht ändern.

Wenn der Benutzer die Berechtigung ohne "Änderung" "anzeigen" hat, ändern Sie die Standardformulare und fügen Sie den Formularelementen deaktivierte oder readonly -Attribute hinzu. Nicht alle Browser unterstützen dies, aber für meine Zwecke kann ich verlangen, dass Benutzer die richtige verwenden. Deaktiviert / readonly Beispiel

Stellte fest, dass nicht alle Browser "readonly" ehren, sodass es einige Steuerelemente auf Readonly, andere für deaktiviert, festgelegt wird. Auf diese Weise können Benutzer bei Bedarf Daten aus den Textsteuerungen kopieren.

#/django/contrib/admin/templates/admin/change_form.html

{# JavaScript for prepopulated fields #}
{% prepopulated_fields_js %}

</div>
</form></div>
{% if has_view_permission and not has_change_permission %}
    <script type="text/javascript">
    jQuery('input:text').attr('readonly', 'readonly');
    jQuery('textarea').attr('readonly', 'readonly');
    jQuery('input:checkbox').attr('disabled', true);
    jQuery('select').attr('disabled', true);
    jQuery('.add-another').hide();
    </script>
{% endif %}

Dieser Snippet macht Superuser zum einzigen mit Schreibzugriff.

class AdminOwn(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if request.user.is_superuser:
            return self.readonly_fields
        #get all fields as readonly
        fields = [f.name for f in self.model._meta.fields]
        return fields

Es ist genau dort im Administrator. Sie können Berechtigungen für Benutzer und Gruppen im Administrator festlegen, um bestimmte Modelle hinzuzufügen, zu ändern und zu löschen.

Aktualisieren: Tut mir leid, ich habe die Frage missverstanden, weil ich die Wortansicht falsch interpretierte, um ihr die Django-Bedeutung zu geben und nicht "schreibgeschützt". Wenn Sie mit dem Administrator nur schreibgeschützt sind, müssen Sie ein wenig Arbeit leisten. Sehen Dieser Thread, wo James Bennett (Django Release Manager) sagt:

Wie Sie durch die Suche nach den Archiven dieser Liste feststellen werden, ist dies nicht etwas, das die Django -Administratorschnittstelle unterstützt. Daher muss jede Lösung vollständig von Ihnen kommen, wenn Sie Ihren eigenen Code schreiben.

und

Der Django -Administrator betreibt drei Berechtigungen: "Hinzufügen", "Änderung" und "Löschen". Es gibt keine "Ansicht, aber keine Änderungen vornehmen".

Bei der zusätzlichen Arbeit werden Sie eine "Readonly" -Verbergung für bestimmte Modelle hinzufügen und die grundlegenden Administratorvorlagen ändern, um zu überprüfen, ob der Benutzer über diese Berechtigung verfügt - und wenn ja, deaktivieren bestimmte Steuerelemente (z. . Dies verhindert das Gelegenheitsbasteln, aber Sie müssen möglicherweise auch die serverseitige Logik ändern, um dieselbe Berechtigung zu überprüfen, um alle Beiträge zu vermeiden, die auf eine hinterhältige Weise zur Umgehung von Berechtigungen erstellt wurden.

Sie können in Ihrem Modell eine "Readonly" -Verbereitung erstellen und den Code von Jasuca mit einer Änderung verwenden:

Models.py:

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=256, null=True, blank=True)

    class Meta:
        permissions = (
            ('readonly_mymodel','Readonly MyModel'),
        )

admin.py:

class MyModelAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if not request.user.is_superuser and request.user.has_perm('mymodel.readonly_mymodel'):
            return [f.name for f in self.model._meta.fields]
        return self.readonly_fields

Im Administrator der Aplikation müssen Sie dem Benutzer die Erlaubnis von "Change" und "Readonly" geben.

Sie können Gruppen im Auth -Modul erstellen. Setzen Sie dann in admin.py basierend auf der Benutzergruppe Login das Attribut modelAdmins readonly_fields. Fügen Sie die Methode Def has_add_permission (self, fordere) hinzu, um für die Gruppe mit Readonly -Erlaubnis Falsch zurückzugeben. Geben Sie das Hinzufügen an, ändern Sie die Berechtigungen an die Gruppe. Sie können nur die Modellattribute lesen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top