2015-05-28 80 views
0

假设我有一个Pen的数据模型。笔可以由金属或木材制成。 金属笔可以是银色或白色 木制笔可以是蓝色或绿色。 所以不得有蓝色的金属笔。Django - 自定义管理页面的添加视图

有没有办法在添加按钮中替换材质选择以显示材质名称/颜色的组合? 我认为这些字段集必须有一个技巧。

# model.py 
from django.db import models 
class Color(models.Model): 
    color = models.CharField(max_length=20, primary_key=True) 
    def __unicode__(self): 
     return self.color 

class Material(models.Model): 
    type = models.CharField(max_length=20) 
    color = models.OneToOneField(Color) 
    def __unicode__(self): 
     return "%s_%s" % (str(self.color), self.type) 

class Pen(models.Model): 
    id = models.AutoField(primary_key=True) 
    label = models.CharField(max_length=20) 
    material = models.ForeignKey(Material) 
    def __unicode__(self): 
     return "%s_%s" % (str(self.material), self.label) 

# admin.py 
from django.contrib import admin 
from .models import Material, Color, Pen 

class PenAdmin(admin.ModelAdmin): 
    list_display = ('label', 'material', 'get_color',) 
    fieldsets = (
     (None, { 
      'fields': ('label', 'material') 
     }), 
    ) 
    def get_color(self, obj): 
     return obj.material.color 
    get_color.short_description = 'Color' 

admin.site.register(Pen, PenAdmin) 
admin.site.register(Material) 
admin.site.register(Color) 

回答

0

我最终没有使用fieldset。我认为这是非常简单的改动。 下面是完成它的步骤:

  1. 覆盖的URL地址:

    url(r'^admin/penshop/pen/add/$', 'penshop.views.add_pen'), 
    url(r'^admin/save_pen/$', 'penshop.views.save_pen'), 
    url(r'^admin/', include(admin.site.urls)), 
    
  2. 使其中有您的自定义页面add_pen.html模板。确保表单包含{% csrf_token %}

  3. 切入点添加到您的views.py处理表单请求:

    @staff_member_required 
    def save_pen(request): 
        if request.method == 'POST': 
         values = request.META.items() 
         label = request.POST.get("label", "") 
         color = request.POST.get("color", "") 
         material = request.POST.get("material", "") 
         if len(label) > 0 and len(color) > 0 and len(material) > 0 and\ 
          not color.startswith('-') and not material.startswith('-'): 
          import pdb;pdb.set_trace 
          col_obj = Color.objects.filter(color=color)[0] 
          mat_obj = Material.objects.filter(type=material, color=col_obj)[0] 
          pen_obj = Pen(label=label, material=mat_obj) 
          pen_obj.save() 
          return HttpResponseRedirect('/admin/penshop/pen/') 
         else: 
          raise Exception('Bad data. It is not going to be saved!') 
        else: 
         return HttpResponseRedirect('/admin/') 
    
        return render(request, 'index.html', {'form': form}) 
    
相关问题