Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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_Model_Widget_Tagging - Fatal编程技术网

Python 添加标记:Django自定义表单小部件用于多个模型字段

Python 添加标记:Django自定义表单小部件用于多个模型字段,python,django,model,widget,tagging,Python,Django,Model,Widget,Tagging,我目前正在为Django创建自己的标签应用程序 以下是模型: class Tag(models.Model): name = models.CharField(max_length=100) class Book(models.Model): title = models.CharField(max_length=100) tags = models.ManyToManyField(Tag) 我为我的模型书创建了一个表单,并为标签输入创建了一个小部件: class B

我目前正在为Django创建自己的标签应用程序

以下是模型:

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

class Book(models.Model):
    title = models.CharField(max_length=100)
    tags = models.ManyToManyField(Tag)
我为我的模型
创建了一个表单,并为
标签
输入创建了一个小部件:

class BookForm(ModelForm):
    class Meta:
        model = Book
        fields = ('title', 'tags')
        widgets = {
            'tags': TagWidget
        }

class TagWidget(Widget):
    """
    Widget for Tag input fields.
    """
    def render(self, name, value, attrs=None):
        final_attrs = self.build_attrs(attrs, name=name)
        final_attrs['class'] = 'tag-input'
        options = []

        # TODO the following tags should be assigned from the model directly
        options.append('tag1');
        options.append('tag2');

        list_element = u'<ul%s>' % flatatt(final_attrs)
        return mark_safe(list_element + '\n<li>' + (u'</li>\n<li>'.join(options)) + '</li>\n</ul>')
类图书格式(ModelForm):
类元:
模型=书
字段=('title','tags')
小部件={
“标记”:标记小部件
}
类标记小部件(小部件):
"""
用于标记输入字段的小部件。
"""
def render(自身、名称、值、属性=无):
final\u attrs=self.build\u attrs(attrs,name=name)
最终属性['class']=“标记输入”
选项=[]
#TODO应直接从模型中指定以下标记
options.append('tag1');
options.append('tag2');
列表元素=u'%flatatt(最终属性)
返回标记“安全”(列表元素+'\n
  • '+(u'
  • \n
  • '.join(选项))+'
  • \n'))
    问题
  • 如何将当前存在的标记添加到选项数组(
    options.append(…)
  • 另外,如何改进html代码的创建(请参见最后一行
    mark_safe
    )?我想把所有html代码放在其他地方(最好放在我的templates文件夹中)
  • 您可以在小部件的构造函数中传递附加数据。差不多

    class TagWidget(Widget):
        def __init__(self, initial_tags, *args, **kwargs)
            self.initial_tags = initial_tags
            super(TagWidget, self).__init__(*args, **kwargs)
    
    # ...
    
    widgets = {
        'tags': TagWidget(initial_tags=('one', 'two', 'three'))
    }
    
    然后可以在
    self.initial\u标签中访问数据

  • 您可以使用函数

  • 您可以在小部件的构造函数中传递附加数据。差不多

    class TagWidget(Widget):
        def __init__(self, initial_tags, *args, **kwargs)
            self.initial_tags = initial_tags
            super(TagWidget, self).__init__(*args, **kwargs)
    
    # ...
    
    widgets = {
        'tags': TagWidget(initial_tags=('one', 'two', 'three'))
    }
    
    然后可以在
    self.initial\u标签中访问数据

  • 您可以使用函数


  • 如何自动判断模型具有哪些标记<代码>初始标签=('1'、'2'、'3')
    必须根据分配给该标签的标签动态分配object@Alprender(self、name、value、attrs=None)如何自动判断模型具有哪些标记<代码>初始标签=('1'、'2'、'3')
    必须根据分配给该标签的标签动态分配object@Alprender(self,name,value,attrs=None)Tag.name应初始化为(unique=True,db_index=True)。Tag.name应初始化为(unique=True,db_index=True)。