2015-05-28 2 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

В итоге я не использовал поля. Я думаю, что это предназначено для очень простых изменений. Вот шаги для выполнения его:

  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}) 
    
Смежные вопросы