我已经为我的模型定义了一个自定义管理操作,它可以完美地按预期工作.我还在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 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)
标题被禁用但仅限编辑.我想在创建对象时禁用它.即先保存.任何人都可以指导我吗?
django-admin startapp 和 python manage.py startapp 有什么区别?他们都创建应用程序并且文件也相同,那么这两者之间有什么区别?
我想在使用 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
我正在尝试构建一个管理操作“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) is_staff=True我需要在 Django 管理界面中为用户提供一些 Django 模型。我不想为每个用户分配权限或组权限给员工用户。
我需要在类中重写哪种方法ModelAdmin,BaseModelAdmin或者还有其他更简单的方法吗?我使用的是 Django 1.4 版本
django-templates django-models django-admin django-admin-tools django-admin-actions
这是
来自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) 我有类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