2016-01-20 133 views
0

我剛剛開始使用Django並希望爲應用程序創建模型。Django:允許用戶將字段添加到模型

我發現Django的功能 - 自動定義爲根據模型和 定義字段類型的形式驗證和HTML控件類型 - 右模型 非常有用的定義選擇的字段設置,我想充分利用它。另外,我想充分利用管理界面。

但是,如果我想允許應用程序的用戶向模型添加字段,該怎麼辦?例如,考慮一個簡單的地址簿。我希望用戶能夠在管理設置中爲其所有聯繫人定義其他屬性,即添加傳真號碼字段,以便可以將傳真號碼添加到所有聯繫人。從關係數據庫的角度來看,我會有一個帶有屬性(PK:atr_ID,atr_name,atr_type)的表和屬性和聯繫人之間的N:N關係,以及來自屬性和聯繫人的外鍵 - 即它會導致3數據庫中的表格。對?

但這樣我就不能直接在Django模型中定義字段類型。現在最好的做法是什麼?我如何使用Djangos功能並允許用戶通過管理界面添加aditional/custom字段?

謝謝! :)

最佳 Teconomix

回答

0

我已經使用了這種方法,首先在django-payslip中看到,以允許擴展字段。這提供了一個用於向模型添加字段的結構,從中可以允許用戶通過標準查看過程添加/編輯(不需要管理員黑客)。這應該足以讓你開始,並且看看django-payslip的源代碼(請參閱視圖)也提供了查看Mixins和窗體作爲如何呈現給用戶的示例。

class YourModel(models.Model): 
    extra_fields = models.ManyToManyField(
     'your_app.ExtraField', 
     verbose_name=_('Extra fields'), 
     blank=True, null=True, 
    ) 


class ExtraFieldType(models.Model): 
    """ 
    Model to create custom information holders. 
    :name: Name of the attribute. 
    :description: Description of the attribute. 
    :model: Can be set in order to allow the use of only one model. 
    :fixed_values: Can transform related exta fields into choices. 
    """ 
    name = models.CharField(
     max_length=100, 
     verbose_name=_('Name'), 
    ) 

    description = models.CharField(
     max_length=100, 
     blank=True, null=True, 
     verbose_name=_('Description'), 
    ) 

    model = models.CharField(
     max_length=10, 
     choices=(
      ('YourModel', 'YourModel'), 
      ('AnotherModel', 'AnotherModel'), # which models do you want to add extra fields to? 
     ), 
     verbose_name=_('Model'), 
     blank=True, null=True, 
    ) 

    fixed_values = models.BooleanField(
     default=False, 
     verbose_name=_('Fixed values'), 
    ) 

    class Meta: 
     ordering = ['name', ] 

    def __unicode__(self): 
     return '{0}'.format(self.name) 



class ExtraField(models.Model): 
    """ 
    Model to create custom fields. 
    :field_type: Connection to the field type. 
    :value: Current value of this extra field. 
    """ 
    field_type = models.ForeignKey(
     'your_app.ExtraFieldType', 
     verbose_name=_('Field type'), 
     related_name='extra_fields', 
     help_text=_('Only field types with fixed values can be chosen to add' 
        ' global values.'), 
    ) 

    value = models.CharField(
     max_length=200, 
     verbose_name=_('Value'), 
    ) 

    class Meta: 
     ordering = ['field_type__name', ] 

    def __unicode__(self): 
     return '{0} ({1}) - {2}'.format(
      self.field_type, self.field_type.get_model_display() or 'general', 
      self.value) 
0

可以使用InlineModelAdmin對象。它應該是這樣的:

#models.py 
from django.db import models 

class Person(models.Model): 
    name = models.CharField(max_length=100) 

class ContactType(models.Model): 
    name = models.CharField(max_length=100) 

class Contact(models.Model): 
    person = models.ForeignKey(Person, on_delete=models.CASCADE) 
    contact_type = models.ForeignKey(ContactType, on_delete=models.CASCADE) 
    value = models.CharField(max_length=100) 

#admin.py 
from django.contrib import admin 

class ContactInline(admin.TabularInline): 
    model = Contact 

class PersonAdmin(admin.ModelAdmin): 
    inlines = [ 
     ContactInline, 
    ] 

順便說一句... stackoverflow的問題應該包含一些代碼。在提出問題之前,你應該嘗試做一些事情。

+0

感謝您的反饋意見以及您對有關缺少代碼的評論 - 我會嘗試添加一些。 我從原始問題中刪除了有關管理界面的部分,以確保問題的重點更加清晰。 Best – teconomix

相關問題