2015-03-03 7 views
0

Проблема, связанная с водительскими правами. Лицензия имеет именованное лицо, которому заданы несколько категорий навыков вождения. Каждая категория водительского мастерства имеет одну дату возобновления и возможные многочисленные ограничения, связанные сНесколько ManyToMany в Django Admin

NameLic CatRenewal dateRestrictions
TommyAM12/05/1544.01, 101, 999
TommyE+B14/12/16
TommyC18/04/18101
TGE+C14/12/1690, 101, 999,
TGB18/04/18105

models.py

class Employee(models.Model): 
    name = models.CharField(max_length=75) 

class DrivingLicenceCategory(models.Model): 
    name = models.CharField(max_length=11) 

class IssuingBody(models.Model): 
    name = models.CharField(max_length=75) 

class DrivingLicence(models.Model): 
    employee_id  = models.ForeignKey(Employee) 
    driver_number = models.CharField(max_length=49) 
    permit_number = models.CharField(max_length=49) 
    issuing_body = models.ForeignKey(IssuingBody) 
    expiry_date  = models.DateField() 

class DrivingLicenceRestrictions(models.Model): 
    name  = models.CharField(max_length=21) 
    description = models.CharField(max_length=1024, blank=True, null=True) 

class DrivingLicenceCategoryRestrictions(models.Model): 
    licence_category = models.ForeignKey(DrivingLicenceCategory) 
    licence_restriction = models.ForeignKey(DrivingLicenceRestrictions) 
    expiry_date   = models.DateField() 

class DrivingLicenceDetail(models.Model): 
    driving_licence   = models.ForeignKey(DrivingLicence) 
    category_restriction = models.ManyToManyField(DrivingLicenceCategoryRestrictions) 

admin.py

from django.contrib import admin 
from drvlic.models import * 

class DrvLicIssuingBodyAdmin(admin.ModelAdmin): 
    search_fields = ('^name',) 

class DrvLicCategoryAdmin(admin.ModelAdmin): 
    search_fields = ('^name',) 

class DrvLicRestrictionsAdmin(admin.ModelAdmin): 
    search_fields = ('^name',) 
    list_display  = ('id', 'name', 'description',) 

class DrvLicLicenceAdmin(admin.ModelAdmin): 
    search_fields = ('^employee',) 

class DrvLicCategoryRestrictionsAdmin(admin.ModelAdmin): 
    search_fields  = ('^employee',) 
    filter_horizontal = ('licence_category', 'licence_restriction') 

admin.site.register(DrvLicIssuingBody, DrvLicIssuingBodyAdmin) 
admin.site.register(DrvLicCategory, DrvLicCategoryAdmin) 
admin.site.register(DrvLicRestrictions, DrvLicRestrictionsAdmin) 
admin.site.register(DrvLicLicence, DrvLicLicenceAdmin) 
admin.site.register(DrvLicCategoryRestrictions, DrvLicCategoryRestrictionsAdmin) 

Является ли моя модель правильно производить таблицу выше в Django администратора или если модель будет другой? Как настроить admin.py для доступа и ввода данных?

Django сообщает мне, что 'DrvLicCategoryRestrictionsAdmin.filter_horizontal[0]' must be a ManyToManyField'. Я думаю, что это неудовлетворительно, если модели.py построены некорректно.

+0

согласно документации https://docs.djangoproject.com/en/1.7/ref/contrib/ admin/# django.contrib.admin.ModelAdmin.filter_horizontal, и, как указывает ошибка, это должно быть поле M2M. Похоже, вы использовали там внешний ключ. –

ответ

0

Вам не нужно '^' для поля поиска. Достаточно search_fields = 'name'. Чтобы отобразить ManyToManyField, вам необходимо перебрать все связанные объекты. Но даже до этого момента, я думаю, вам нужно перестроить свои модели, чтобы иметь одну модель «все охватывающей», которая содержит ту таблицу, которую вы пытаетесь создать. Так, что-то вроде:

models.py

class License(models.Model): 
    employee = models.ForeignKey(Employee) 
    category = models.ManyToMany(DrivingLicenceCategory) 
    restriction = models.ManyToMany(DrivingLicenceRestrictions) 
    expiry_date = models.DateField() 

    def get_categories(self): 
     return ",<br>".join([a.name for a in self.category.all()]) 

    def get_restrictions(self): 
     return ",<br>".join([a.name for a in self.restriction.all()]) 

admin.py

class LicenseAdmin(admin.ModelAdmin): 
    list_display = ('employee', 'get_categories', 'get_restrictions', 'expirary_date')