Django2.1: поле геометрии в представлении изменения сайта администратора с помощью has_view_permission () - PullRequest
0 голосов
/ 11 марта 2019

Я ищу правильный способ отображения поля карты с виджетом OSM по умолчанию в форме изменения администратора для пользователя только с has_view_permission () .

Я понимаю, что такого рода разрешение предоставит пользователям доступ только для чтения к моделям в админке. И все отображаемые поля будут полями только для чтения, так как по умолчанию has_change_permission () имеет значение False. И поскольку поведение Django по умолчанию требуется для геометрических полей в read_only_fields, данные будут отображаться в виде поля WKT.

Я попытался переопределить форму в соответствии с примечанием к выпуску django посоветовал :

# models.py
from django.contrib.gis.db import models
class Adress(models.ModelAdmin):
    text_block = models.TextField(
        "Full Adress", blank=True, null=True)
    geom = models.PointField(
        "Position WGS84", blank=True, null=True, geography=True)

# admin.py
from my_app.models import Adress
class AdressAdmin(geo_admin.OSMGeoAdmin):
    modifiable = True
    fieldsets = (
        ('My adress', {
            'fields': (
                'text_block',
        )}),
        ('Position', {
            'fields': (
                'geom',
        )}),
    )

    def get_form(self, request, obj=None, **kwargs):
        if not self.has_change_permission(request, obj):
            return AdressViewAdminForm
        return super().get_form(request, obj, **kwargs)

admin.site.register(Adress, AdressAdmin)

# forms.py
class AdressViewAdminForm(forms.ModelForm):

    class Meta:
        model = models.Adress
        fields = ('text_block', 'geom',)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        instance = kwargs.get('instance', None)
        if instance and instance.geom:
            self.fields.get('geom').widget.attrs['read_only'] = False

И присвоить атрибуту read_only для поля geom значение False. Но как только вызывается ModelAdmin.changeform_view (), к полям readonly будет добавлен 'geom' (CF: source ).

На данный момент единственный способ, которым я вижу, это принудительно вызвать has_change_permission () для пользователя только с has_view_permission () и определить все поля (кроме geom) как read_only_fields. И, наконец, не забывая скрыть кнопки «сохранить» из формы изменений.

Так есть ли прямой способ отобразить нередактируемое поле geom в виде карты в форме изменения сайта администратора для пользователя только с has_view_permission ()?

Спасибо за вашу помощь.

...