小编mis*_*bah的帖子

django admin登录突然要求csrf令牌

几分钟前我很容易登录我的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

17
推荐指数
3
解决办法
1万
查看次数

覆盖django管理员ListFilter模板

我想覆盖默认的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为每个ForeignKeyManyToMany关系定义自定义.

我的项目是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

5
推荐指数
1
解决办法
1526
查看次数

将django RawQuerySet转换为Queryset

我有2个Django模型,ModelAArrayField该用于存储的主键值的大列表(可能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查询集?

有没有更好的方法呢?

文档:

python django postgresql django-models django-managers

5
推荐指数
1
解决办法
5794
查看次数

如何向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类也不是一个选项..因为表单字段是动态的.

任何帮助将不胜感激.

css forms django django-templates

4
推荐指数
1
解决办法
861
查看次数