J'ai un site Django avec beaucoup de modèles et de formulaires. J'ai beaucoup de formulaires personnalisés et de jeux de formulaires et de formulaires en ligne, ainsi que de validation et de requêtes personnalisées. Par conséquent, l'action d'ajout de modèle dépend des formulaires qui nécessitent d'autres éléments, et le 'add model' dans Django admin passe par un 500 depuis un ensemble de requêtes personnalisé.
Est-il possible de désactiver la fonctionnalité "Ajouter un modèle" pour certains modèles?
Je voudrais /admin/appname/modelname/add/
pour donner un message d'erreur 404 (ou un message d'erreur approprié "Go away"), je ne souhaite pas que le bouton "Ajouter $ MODELNAME" soit activé /admin/appname/modelname
vue.
Django admin fournit un moyen de désactiver les actions d’administrateur (http://docs.djangoproject.com/en/dev/ref/contrib/admin/actions/#disabling-actions), mais la seule action de ce modèle est 'delete_selected'. les actions de l'administrateur n'agissent que sur les modèles existants. Y a-t-il une manière Django-esque de faire cela?
C'est facile, il suffit de surcharger has_add_permission
méthode dans votre classe Admin
comme ceci:
class MyAdmin(admin.ModelAdmin):
def has_add_permission(self, request, obj=None):
return False
Par défaut, syncdb crée 3 autorisations de sécurité pour chaque modèle:
Si vous êtes connecté en tant qu'administrateur, vous obtenez TOUT quoi qu'il arrive.
Mais si vous créez un nouveau groupe d'utilisateurs appelé "Accès général" (par exemple ) vous pouvez attribuer UNIQUEMENT les autorisations CHANGE et DELETE à tous vos modèles.
Ensuite, tout utilisateur connecté qui est membre de ce groupe n'aura pas l'autorisation "Créer", rien de ce qui le concerne ne s'affichera à l'écran.
Je pense que cela vous aidera. Le code ci-dessous doit être dans le fichier admin.py
@admin.register(Author)
class AuthorAdmin(admin.ModelAdmin):
list_display = ('name', )
list_filter = ('name', )
search_fields = ('name', )
list_per_page = 20
# This will help you to disbale add functionality
def has_add_permission(self, request):
return False
# This will help you to disable delete functionaliyt
def has_delete_permission(self, request, obj=None):
return False
# In admin
# make the related field can't be added
def get_form(self, request, obj=None, **kwargs):
form = super().get_form(request, obj, **kwargs)
form.base_fields['service'].widget.can_add_related = False
return form
# In inline formset e.g. admin.TabularInline
# disable all
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj, **kwargs)
service = formset.form.base_fields['service']
service.widget.can_add_related = service.widget.can_change_related = service.widget.can_delete_related = False
return formset
dans service = formset.form.base_fields['service']
base_fields
sont les champs définis dans le modèle
si défini dans le formulaire, utilisez:
product = formset.form.declared_fields['product']
C'est une réponse trop tardive. Il suffit de poster ceci comme si quelqu'un trouvait la même solution.
Dans le fichier admin.py, vous pouvez effectuer les opérations suivantes:
class MyModelForm(forms.ModelForm):
class Meta:
model = MyModel
fields = '__all__'
class MyModelAdmin(admin.ModelAdmin):
form = QuestionTrackAdminForm
list_display = ['title', 'weight']
readonly_fields = ['title', 'weight']
admin.site.register(MyModel, MyModelAdmin)
Ici, "readonly_fields" fait la magie. Merci.