class GroupAdmin(admin.ModelAdmin): search_fields = ('name',) ordering = ('name',) filter_horizontal = ('permissions',) def formfield_for_manytomany(self, db_field, request=None, **kwargs): if db_field.name == 'permissions': qs = kwargs.get('queryset', db_field.remote_field.model.objects) # Avoid a major performance hit resolving permission names which # triggers a content_type load: kwargs['queryset'] = qs.select_related('content_type') return super().formfield_for_manytomany(db_field, request=request, **kwargs)
时间: 2024-04-27 07:25:19 浏览: 185
这段代码是用来定义 Django 管理后台中的一个名为 Group 的模型的管理类。其中:
- `search_fields = ('name',)` 表示在管理后台的列表页中添加一个搜索框,可以搜索该模型的 name 字段。
- `ordering = ('name',)` 表示在管理后台的列表页中按照 name 字段进行排序。
- `filter_horizontal = ('permissions',)` 表示在管理后台的编辑页中使用水平的多选框来选择 permissions 字段的值。
另外,`formfield_for_manytomany` 方法是一个钩子方法,用来为多对多关系字段定制表单字段。在这里,它判断如果是 permissions 字段,则通过 `select_related` 方法预先加载 content_type 字段,以避免性能问题。最后,调用父类的方法来创建表单字段。
相关问题
class Migration(migrations.Migration): dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '__first__'), ] operations = [ migrations.CreateModel( name='LogEntry', fields=[ ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), ('action_time', models.DateTimeField(auto_now=True, verbose_name='action time')), ('object_id', models.TextField(null=True, verbose_name='object id', blank=True)), ('object_repr', models.CharField(max_length=200, verbose_name='object repr')), ('action_flag', models.PositiveSmallIntegerField(verbose_name='action flag')), ('change_message', models.TextField(verbose_name='change message', blank=True)), ('content_type', models.ForeignKey( to_field='id', on_delete=models.SET_NULL, blank=True, null=True, to='contenttypes.ContentType', verbose_name='content type', )), ('user', models.ForeignKey( to=settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='user', )), ], options={ 'ordering': ('-action_time',), 'db_table': 'django_admin_log', 'verbose_name': 'log entry', 'verbose_name_plural': 'log entries', }, bases=(models.Model,), managers=[ ('objects', django.contrib.admin.models.LogEntryManager()), ], ), ]
这段代码是 Django 后台管理系统中的 `LogEntry` 模型类的数据表结构定义,以及对应的数据库迁移操作。
在 `class Migration(migrations.Migration)` 中,定义了当前这个数据库迁移的名称和依赖关系。该数据库迁移依赖于 `settings.AUTH_USER_MODEL` 和 `contenttypes` 应用程序的第一个迁移操作。
在 `operations` 中,定义了一个 `CreateModel` 操作,用于创建 `LogEntry` 模型类对应的数据表。在 `CreateModel` 中,定义了 `LogEntry` 模型类中的各个字段,包括 `id`、`action_time`、`object_id`、`object_repr`、`action_flag`、`change_message`、`content_type` 和 `user` 等。
其中,`ForeignKey` 字段表示对另一个模型类的外键引用,`to` 参数表示被引用的模型类,`on_delete` 参数表示引用的模型类删除时的行为。在这里,`content_type` 字段是对 `ContentType` 模型类的外键引用,`user` 字段是对 `AUTH_USER_MODEL` 模型类的外键引用。
在 `CreateModel` 中,还定义了 `LogEntry` 模型类的各种属性和方法,包括 `ordering`、`db_table`、`verbose_name`、`verbose_name_plural` 和 `managers` 等。
最后,通过执行数据库迁移操作,将 `LogEntry` 模型类对应的数据表结构应用到数据库中。
from django.contrib import admin from django.urls import reverse from django.utils.html import format_html from django.shortcuts import redirect from .models import Drug @admin.register(Drug) class DrugAdmin(admin.ModelAdmin): change_list_template = 'admin/drug/change_list.html' def get_urls(self): urls = super().get_urls() custom_urls = [ path('import-csv/', self.import_csv), ] return custom_urls + urls def import_csv(self, request): if request.method == 'POST': # TODO: import CSV data self.message_user(request, 'CSV data imported successfully') return redirect('..') return render(request, 'admin/drug/import_csv.html') def changelist_view(self, request, extra_context=None): if not request.GET.get('ordering'): # set default ordering request.GET = request.GET.copy() request.GET['ordering'] = 'name' return super().changelist_view(request, extra_context=extra_context) def interaction_display(self, obj): return format_html('<pre>{}</pre>', obj.interaction) interaction_display.short_description = 'Interaction' def get_actions(self, request): actions = super().get_actions(request) del actions['delete_selected'] return actions def delete_model(self, request, obj): # TODO: delete model pass def delete_selected(self, request, queryset): # TODO: delete selected models pass def get_queryset(self, request): qs = super().get_queryset(request) qs = qs.order_by('name') return qs def add_view(self, request, form_url='', extra_context=None): self.change_list_template = None return super().add_view(request, form_url=form_url, extra_context=extra_context) def change_view(self, request, object_id, form_url='', extra_context=None): self.change_list_template = None return super().change_view(request, object_id, form_url=form_url, extra_context=extra_context) def delete_view(self, request, object_id, extra_context=None): self.change_list_template = None return super().delete_view(request, object_id, extra_context=extra_context) 怎么重写ModelAdmin中的特性
可以通过在自定义的ModelAdmin中重写一些特定的方法来改变其行为,例如:
1. get_urls():返回一个包括自定义URL路由的URLconf列表。
2. changelist_view():返回一个HttpResponse对象,它将呈现显示模型对象的更改列表视图。
3. add_view():返回一个HttpResponse对象,它将呈现用于添加新模型对象的视图。
4. change_view():返回一个HttpResponse对象,它将呈现用于更改现有模型对象的视图。
5. delete_view():返回一个HttpResponse对象,它将呈现用于删除现有模型对象的视图。
6. get_queryset():返回一个查询集,该查询集包含ModelAdmin管理的模型对象。
7. get_actions():返回一个字典,其中包含ModelAdmin提供的所有批量操作。
8. delete_model():删除指定的模型对象。
9. delete_selected():批量删除指定的模型对象。
通过重写这些方法,您可以更改ModelAdmin管理的模型对象的默认行为,并添加自定义功能。
阅读全文