Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 创建Django管理中间页_Python_Django_Admin - Fatal编程技术网

Python 创建Django管理中间页

Python 创建Django管理中间页,python,django,admin,Python,Django,Admin,当我在django admin中保存模型时,我需要一种方法来显示中间页面 我想完成的是在“保存”一个模型后,显示一个包含该模型所有属性的页面,然后有一个按钮,上面写着“打印”。我曾经在单击save时使用jquerydialog div解决这个问题。这意味着我在实际保存模型之前显示了设置打印视图,但现在需要先验证模型 这与“删除模型”操作的实现方式类似。不过,我似乎不知道从哪里开始找 编辑: 我已经开始在django.contrib.admin.options.py中查找response\u ch

当我在django admin中保存模型时,我需要一种方法来显示中间页面

我想完成的是在“保存”一个模型后,显示一个包含该模型所有属性的页面,然后有一个按钮,上面写着“打印”。我曾经在单击
save
时使用jquerydialog div解决这个问题。这意味着我在实际保存模型之前显示了设置打印视图,但现在需要先验证模型

这与“删除模型”操作的实现方式类似。不过,我似乎不知道从哪里开始找

编辑: 我已经开始在
django.contrib.admin.options.py
中查找
response\u change
response\u add
方法。但不知道如何覆盖它们。而且它只需要一个特定的模型,所以它不是通用的。我还发现了ModelAdmin类中的模板列表。仍然不确定如何在不将管理员黑客攻击到位的情况下继续

编辑2:
在下面添加了我的工作解决方案。

您可以向ModelAdmin添加视图和URL,并覆盖ModelAdmin添加视图以相应重定向

class MyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(MyModelAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^my_view/$', self.my_view)
        )
        return my_urls + urls

    def my_view(self, request):
        # custom view which should return an HttpResponse
        pass

所以,经过一点编码,我让它开始工作

我的modeladmin现在看起来与此类似

class MyModelAdmin(admin.ModelAdmin):
    def get_urls(self):
        urls = super(MyModelAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^my_view/$', self.my_view)
        )
        return my_urls + urls

    def my_view(self,request,pk):
        from django.shortcuts import render_to_response
        from django.template import RequestContext

        object = Model.objects.get(pk=pk)
        model_dict = model_object.__dict__
        return render_to_response('admin/app_name/model/model_view.html',locals(),context_instance=RequestContext(request))

    @csrf_protect_m
    @transaction.commit_on_success
    def add_view(self, request, form_url='', extra_context=None):
        "The 'add' admin view for this model."
        model = self.model
        opts = model._meta

        if not self.has_add_permission(request):
            raise PermissionDenied

        ModelForm = self.get_form(request)
        formsets = []
        inline_instances = self.get_inline_instances(request)
        if request.method == 'POST':
            form = ModelForm(request.POST, request.FILES)
            if form.is_valid():
               new_object = self.save_form(request, form, change=False)
               form_validated = True
            else:
               form_validated = False
               new_object = self.model()
            prefixes = {}
            for FormSet, inline in zip(self.get_formsets(request), inline_instances):
               prefix = FormSet.get_default_prefix()
               prefixes[prefix] = prefixes.get(prefix, 0) + 1
               if prefixes[prefix] != 1 or not prefix:
                  prefix = "%s-%s" % (prefix, prefixes[prefix])
               formset = FormSet(data=request.POST, files=request.FILES,
                              instance=new_object,
                              save_as_new="_saveasnew" in request.POST,
                              prefix=prefix, queryset=inline.queryset(request))
               formsets.append(formset)
            if all_valid(formsets) and form_validated:
               self.save_model(request, new_object, form, False)
               self.save_related(request, form, formsets, False)
               self.log_addition(request, new_object)
               log.info('The new object has %s id' % new_object.id)
               return HttpResponseRedirect('/admin/draws/contest/contest_view/%s' % new_object.id)  <-- changed to my new one
               .................
               .................
类MyModelAdmin(admin.ModelAdmin):
def get_URL(自):
url=super(MyModelAdmin,self).get_url()
我的URL=模式(“”,
(r“^my_view/$”,self.my_view)
)
返回我的URL+URL
定义我的视图(自我、请求、主键):
从django.shortcuts导入渲染到响应
从django.template导入请求上下文
object=Model.objects.get(pk=pk)
model\u dict=model\u对象__
返回render_to_response('admin/app_name/model/model_view.html',locals(),context_instance=RequestContext(request))
@保护
@成功时提交事务
def add_视图(self、request、form_url=''、extra_context=None):
“此模型的“添加”管理视图。”
model=self.model
opts=模型
如果不是self.has\u add\u权限(请求):
加薪许可被拒绝
ModelForm=self.get\u表单(请求)
formsets=[]
inline\u instances=self.get\u inline\u实例(请求)
如果request.method==“POST”:
form=ModelForm(request.POST、request.FILES)
如果form.is_有效():
新建对象=self.save表单(请求、表单、更改=False)
形式=真
其他:
形式_=错误
new_object=self.model()
前缀={}
对于表单集,在zip中内联(self.get\u表单集(请求),内联\u实例):
prefix=FormSet.get\u default\u prefix()
前缀[前缀]=前缀。获取(前缀,0)+1
如果前缀[前缀]!=1或不是前缀:
prefix=“%s-%s”%(前缀,前缀[前缀])
formset=formset(data=request.POST,files=request.files,
实例=新对象,
将_另存为_new=“_saveasnew”在request.POST中,
prefix=prefix,queryset=inline.queryset(请求))
追加(formset)
如果所有表格有效(表格集)和表格有效:
self.save\u模型(请求、新\u对象、表单、False)
与self.save_相关(请求、表单、表单集、False)
self.log\u添加(请求、新\u对象)
log.info('新对象具有%s id“%new\u object.id”)

返回HttpResponseRedirect('/admin/draws/contest/contest\u view/%s'%new\u object.id)您可以创建一个表单,该表单在“是否确定”步骤中有额外的验证步骤

在我们的models.py中给定此模型:

from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
在forms.py中添加表单:

from django import forms
from .models import Person

class PersonForm(forms.ModelForm):
    i_am_sure = forms.BooleanField(required=False, widget=forms.HiddenInput())

    def __init__(self, *args, **kwargs):
        super(PersonForm, self).__init__(*args, **kwargs)

        if self.errors.get('i_am_sure'):
            # show the 'are you sure' checkbox when we want confirmation
            self.fields['i_am_sure'].widget = forms.CheckboxInput()

    def clean(self):
        cleaned_data = super(PersonForm, self).clean()

        if not self.errors:
            # only validate i_am_sure once all other validation has passed
            i_am_sure = cleaned_data.get('i_am_sure')
            if self.instance.id and not i_am_sure:
                self._errors['i_am_sure'] = self.error_class(["Are you sure you want to change this person?"])
                del cleaned_data['i_am_sure']

        return cleaned_data

    class Meta:
        model = Person
如果你想和Django管理员一起使用。在admin.py中指定此表单:

from django.contrib import admin
from .forms import PersonForm
from .models import Person

class PersonAdmin(admin.ModelAdmin):
    form = PersonForm

admin.site.register(Person, PersonAdmin)

但是请注意,Django管理表单上有一个隐藏输入的bug

我想我明白你的意思,我会在试用后回来的。干杯现在开始工作了,谢谢你让我走上正轨!如果有人感兴趣,请在下面发布代码。