标签: django-admin-actions

Django:如何添加自定义按钮来管理更改执行管理操作的表单页面?

我已经为我的模型定义了一个自定义管理操作,它可以完美地按预期工作.我还在SO上看了多个向管理员更改表单页面添加按钮的方法.只有我缺少的一步是如何在更改表单页面中创建一个按钮,使用当前对象执行我的自定义管理操作.

目标是允许管理员单独检查每个对象并对其执行操作,而无需返回列表视图,选择检查对象,以及从列表执行操作.

我的自定义管理操作如下所示:

def admin_apply_change(modeladmin, request, queryset):
    # loop over objects in query set and perform action
Run Code Online (Sandbox Code Playgroud)

我假设有一种简单而干净的方式在管理员更改表单中调用此操作,其中queryset只包含管理员正在查看的当前打开的对象.

注意:如果按钮位于更改表单的底部,Save按钮旁边而不是位于顶部的按钮不是History很明显,那么这将是首选.

请参阅Remi的解决方案.为了使其工作,需要进行以下更正:

1:在重写response_change某些变量的初始化时缺少:

opts = self.model._meta
pk_value = obj._get_pk_val()
preserved_filters = self.get_preserved_filters(request)
Run Code Online (Sandbox Code Playgroud)

2:新的包含标签custom_submit_row应该放在模板标签而不是管理员中(参见自定义模板标签的文档)

3:这是你可以放松一段时间的疏忽.在change_form.html您不仅需要更改建议的行:

{% if save_on_top %}{% block submit_buttons_top %}{% submit_row %}{% endblock %}{% endif %}
Run Code Online (Sandbox Code Playgroud)

而且在底部submit_row出现的更重要的一行:

{% block submit_buttons_bottom %}{% submit_row %}{% endblock %}
Run Code Online (Sandbox Code Playgroud)

(它位于javascript块的正上方change_form.html)

django django-admin django-admin-actions

16
推荐指数
2
解决办法
1万
查看次数

使django模型字段只读或在管理员中禁用,同时第一次保存对象

我想在最初保存时禁用django admin中的模型中的几个字段.

"<input type="text" id="disabledTextInput" class="form-control" placeholder="Disabled input">"
Run Code Online (Sandbox Code Playgroud)

像这样.

我的模型是:

class Blogmodel(models.Model):
    tag = models.ForeignKey(Tag)
    headline = models.CharField(max_length=255)
    image=models.ImageField(upload_to=get_photo_storage_path, null=True, blank=False)
    body_text = models.TextField()
    pub_date = models.DateField()
    authors = models.ForeignKey(Author)
    n_comments = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)

我想禁用"标题"和"n_comments".我在admin.py文件中尝试了它,但它没有禁用初始保存的字段.但是为了编辑其工作的字段,它使字段只读.

在admin.py中

class ItemAdmin(admin.ModelAdmin):
    exclude=("headline ",)
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['headline ']
        else:
            return []
Run Code Online (Sandbox Code Playgroud)

标题被禁用但仅限编辑.我想在创建对象时禁用它.即先保存.任何人都可以指导我吗?

python django django-admin django-admin-actions

12
推荐指数
4
解决办法
2万
查看次数

django-admin startapp v/s python manage.py startapp

django-admin startapp 和 python manage.py startapp 有什么区别?他们都创建应用程序并且文件也相同,那么这两者之间有什么区别?

python django django-admin django-apps django-admin-actions

7
推荐指数
1
解决办法
5509
查看次数

如何使用 django admin 在数据库中插入记录后添加函数?

我想在使用 django-admin panel 将记录插入数据库后执行一个函数。

我有一个产品表,当 django 管理面板将记录插入数据库时​​,我想向用户发送通知。我知道如何向用户发送通知,但我不知道在哪里放置我的代码。

任何建议都会有帮助的。

插入记录后如何执行通知用户的功能?

这是我在插入记录后执行的代码:

from fcm_django.models import FCMDevice

device = FCMDevice.objects.all()

device.send_message(title="Title", body="Message", icon=..., data={"test": "test"})
Run Code Online (Sandbox Code Playgroud)

我搜索了很多但没有找到任何有用的东西。

感谢这个伟大的社区。

python django django-admin django-admin-tools django-admin-actions

6
推荐指数
1
解决办法
2741
查看次数

从 django 管理操作中间页面重定向到更改表单页面

我正在尝试构建一个管理操作“download_selected”,它将下载选定的模型。选择该操作后,我会重定向到中间页面,以便用户可以选择下载格式。当用户选择下载格式并单击“下载”时,就会下载文件。但停留在同一个中间页面上。如何将其重定向回更改表单管理页面?我想要的这个重定向类似于 django“下载所选文件”默认管理操作。谢谢。

这是我的代码。

管理员.py

class SelectDownloadFormatForm(forms.Form):
    DOWNLOAD_TYPE_CHOICES=[('csv','csv'),
                           ('json', 'json'),
                           ('xml','xml')]

    _selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
    download_type = forms.ChoiceField(label=_('Select a Download type'), choices=DOWNLOAD_TYPE_CHOICES, widget=forms.RadioSelect())


def download_selected(self, request, queryset):
    import csv
    from django.http import HttpResponse, HttpResponseRedirect
    import StringIO

    form = None

    if 'download' in request.POST:
        form = self.SelectDownloadFormatForm(request.POST)

        if form.is_valid():
            dtype = form.cleaned_data['download_type']
            print dtype
            response = HttpResponse(content_type='text/csv')
            response['Content-Disposition'] = 'attachment; filename="export.csv"'
            writer = csv.writer(response)
            writer.writerow(['id', 'name', 'qid' ,'label', 'name', 'field'])

            count = 0
            for s in queryset:
                questions_query = ParentModel.objects.filter(parent_form_id = …
Run Code Online (Sandbox Code Playgroud)

django django-admin django-admin-actions

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

Django Admin - 允许为 is_staff 用户显示模型

is_staff=True我需要在 Django 管理界面中为用户提供一些 Django 模型。我不想为每个用户分配权限或组权限给员工用户。

我需要在类中重写哪种方法ModelAdminBaseModelAdmin或者还有其他更简单的方法吗?我使用的是 Django 1.4 版本

django django-admin django-admin-actions

5
推荐指数
3
解决办法
5175
查看次数

如何在 django 管理页面的每一行的列表页面上放置一个按钮

我想为每一行添加一个按钮,如按钮位置上的图片所示,该按钮将弹出相同模式的字段内容或我插入的要显示的内容。

在此输入图像描述

django-templates django-models django-admin django-admin-tools django-admin-actions

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

堆叠内联和表格内联之间的差异

这是 来自django.db导入模型的models.py文件

# Create your models here.
class Item(models.Model):
    name=models.CharField(max_length=250)
    description = model.TextField()

    class Meta:
        oredering['name']
    def __unicode__(self):
        return self.name
    @permalink
    def get_absolute_url:
        retun ('item_detail',None,{'object_id':self_id})
class Photo(models.Model):
    item = models.ForiegnKey(Item)
    title=models.ChaField(max_length=250)

    image=models.IMageField(upload_to='photos')
    caption=models.TextField(blank=True)

    class Meta:
        ordering=['title']
    def __unicode__(self):
        return self.title
    @permalink
    def get_absolute_url(self):
        retun ('photo_detail',None,{'object_id':self_id})
Run Code Online (Sandbox Code Playgroud)

这是我的admin.py:

from django.contrib import admin
from  models import Item
from  models import Photo

# Register your models here.
class PhotoInline(admin.StackedInline):
    model = Photo

class ItemAdmin(admin.ModelAdmin):
    inlines = [PhotoInline]

admin.site.register(Item, ItemAdmin)
admin.site.register(Photo) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin django-admin-actions

4
推荐指数
2
解决办法
2731
查看次数

如何在models.py中的save方法中获取内联对象

我有类Invoice,其中(简化)具有以下属性:

class Invoice(models.Model)
    number = models.CharField(verbose_name="Number", max_length=16)
    issue_date = models.DateTimeField(verbose_name="Issue date", default=datetime.now)
    total = models.FloatField(verbose_name="Total", blank=True, null=True)
Run Code Online (Sandbox Code Playgroud)

然后,我有InvoiceLine类,它代表发票可以拥有的行/行:

class InvoiceLine(models.Model):
    invoice = models.ForeignKey(Invoice, verbose_name="Invoice")
    description = models.CharField(verbose_name="Description", max_length=64)
    line_total = models.FloatField(verbose_name="Line total")
Run Code Online (Sandbox Code Playgroud)

InvoiceLine是Invoice的内联,我想要实现的是,当在管理员中有人用发票线(一个或多个)保存发票时,计算发票总额.我试图通过覆盖方法保存来做到这一点:

class Invoice(models.Model)
    number = models.CharField(verbose_name="Number", max_length=16)
    issue_date = models.DateTimeField(verbose_name="Issue date", default=datetime.now)
    total = models.FloatField(verbose_name="Total", blank=True, null=True)

    def save(self, *args, **kwargs):
         invoice_lines = InvoiceLine.objects.filter(invoice=self.id)
         self.total = 0
         for line in invoice_lines:
             self.total=self.total+line.line_total
         super(Invoice, self).save(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

问题是,当我在InvoiceLine中添加元素时,第一次保存并调用functionsave时,内联(InvoiceLine)中的新元素尚未存储,所以当我这样做时InvoiceLine.objects.filter(invoice=self.id),它们不会被考虑在内.因此,这种方法的唯一方法是节省两次.我也尝试过:

def save(self, *args, **kwargs):
    super(Invoice, self).save(*args, **kwargs)
    invoice_lines = InvoiceLine.objects.filter(invoice=self.pk) …
Run Code Online (Sandbox Code Playgroud)

django django-models django-admin django-modeladmin django-admin-actions

2
推荐指数
1
解决办法
2181
查看次数