几分钟前我很容易登录我的django管理控制台.我必须在以超级用户身份登录时导致此错误的某些地方进行了更改:
禁止(403)CSRF验证失败.请求中止.
这个错误让我措手不及,因为我整晚都在登录.为什么我突然需要一个用于管理员登录的csrf令牌?你会认为签到表格已经有了.这是我的admin.py:
from django.contrib import admin
from accounts.models import Image, Category, UserProfile
class ImageAdmin(admin.ModelAdmin):
list_display = ["__unicode__", "title", "created"]
admin.site.register(Image, GenericImageAdmin)
class CategoryAdmin(admin.ModelAdmin):
list_display = ["category"]
admin.site.register(Category, CategoryAdmin)
admin.site.register(UserProfile)
Run Code Online (Sandbox Code Playgroud) 我想覆盖默认的django管理过滤器模板,使用我自己的模板:
https://github.com/feincms/feincms/blob/master/feincms/templates/admin/filter.html
我SimpleListFilter
通过继承来编写自己的类django.contrib.admin.SimpleListFilter
class PublisherStateFilter(admin.SimpleListFilter):
title = _('Status')
parameter_name = 'status'
template = 'admin/blogitty/filter.html'
[...]
Run Code Online (Sandbox Code Playgroud)
这非常有效.
但是我想对所有管理过滤器使用相同的模板.有没有办法覆盖给定应用程序的所有过滤器模板,而无需ListFilter
为每个ForeignKey
和ManyToMany
关系定义自定义.
我的项目是blogitty
.我尝试了模板DIR的两个选项:
blogitty/templates/admin/filter.html
Run Code Online (Sandbox Code Playgroud)
和:
blogitty/templates/admin/blogitty/filter.html
Run Code Online (Sandbox Code Playgroud)
没运气 :-(
浏览源代码:
https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1030
return TemplateResponse(request, form_template or [
"admin/%s/%s/change_form.html" % (app_label, opts.model_name),
"admin/%s/change_form.html" % app_label,
"admin/change_form.html"
], context)
Run Code Online (Sandbox Code Playgroud)
https://github.com/django/django/blob/master/django/contrib/admin/options.py#L1569
return TemplateResponse(request, self.change_list_template or [
'admin/%s/%s/change_list.html' % (app_label, opts.model_name),
'admin/%s/change_list.html' % app_label,
'admin/change_list.html'
], context)
Run Code Online (Sandbox Code Playgroud)
据我了解.Django ModelAdmin检查多个路径以呈现给定模型的changeform或changelist.但是,对于a ListFilter
,不会进行额外的检查以加载自定义模板.
https://github.com/django/django/blob/master/django/contrib/admin/filters.py#L60
class ListFilter(object):
title = None
template = 'admin/filter.html' …
Run Code Online (Sandbox Code Playgroud) django django-admin django-admin-filters cookiecutter-django
我有2个Django模型,ModelA
用ArrayField
该用于存储的主键值的大列表(可能50K +列表)
class ModelA(models.Model):
pk_values = ArrayField(models.IntegerField())
class CustomManager(manager.Manager):
def get_for_index(self, index_id):
qs = self.get_queryset()
obj = ModelA.objects.get(pk=index_id)
return qs.filter(id__in=obj.pk_values)
class ModelB(models.Model):
# [...] some fields
objects = CustomManager()
Run Code Online (Sandbox Code Playgroud)
这有效:
qs = ModelB.objects.get_for_index(index_id=1)
Run Code Online (Sandbox Code Playgroud)
但是,如果"pk_values"是一个大型列表,这将是超级慢的.
所以我尝试了原始的SQL查询:
class CustomManager(manager.Manager):
def get_for_index(self, index_id):
qs = self.get_queryset()
sql = "SELECT * FROM myapp_model_b JOIN myapp_model_a ON myapp_model_b.id = ANY(myapp_model_a.pk_values) WHERE myapp_model_a.id = '%s'" % index_id
return qs.raw(sql)
Run Code Online (Sandbox Code Playgroud)
但这会返回一个django.db.models.query.RawQuerySet
实例.
但有了这个,我就不能做事queryset.values()
了.
如何将其转换为普通的Django查询集?
有没有更好的方法呢?
文档:
我刚刚了解到:
Form.error_css_class
Form.required_css_class
Run Code Online (Sandbox Code Playgroud)
文档:https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.error_css_class
因此,通过在表单中定义'error_css_class'和'required_css_class'
class MyForm(forms.Form):
error_css_class = 'error'
required_css_class = 'required'
name = forms.CharField(...)
Run Code Online (Sandbox Code Playgroud)
我可以:
<div class="field-wrapper {{ form.name.css_classes }}">
...
</div>
Run Code Online (Sandbox Code Playgroud)
这将输出:
<div class="field-wrapper required">
...
</div>
Run Code Online (Sandbox Code Playgroud)
但是我想在字段中添加其他类,例如我想为"name"字段添加"text name"css类.阅读文档,我认为它是可能的.
https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.BoundField.css_classes
看完上面后我试着去做
self.fields['name'].css_classes('name text')
Run Code Online (Sandbox Code Playgroud)
这不起作用.我明白了
'CharField' object has no attribute 'css_classes'
Run Code Online (Sandbox Code Playgroud)
我也试过了
name = forms.CharField(css_classes='name text')
Run Code Online (Sandbox Code Playgroud)
类型错误
__init__() got an unexpected keyword argument 'css_classes'
Run Code Online (Sandbox Code Playgroud)
我知道我可以在字段小部件中添加额外的attr
self.fields['name'].widget.attrs['class'] = 'name text'
Run Code Online (Sandbox Code Playgroud)
但我想将css类添加到字段包装器中.
我可以编写一个自定义模板标签...来检查字段名称/类型并返回适当的css类...但如果有内置的东西..我希望保持我的模板清洁:-).
每个字段的硬编码css类也不是一个选项..因为表单字段是动态的.
任何帮助将不胜感激.