0

我目前正在为 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)

我为我的模型创建了一个表单,Book并为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>')

问题

  1. 如何将当前存在的标签添加到选项数组(options.append(...))?
  2. 另外,如何改进 html 代码的创建(见最后一行mark_safe)?我想将所有 html 代码放在其他地方(最好放在我的模板文件夹中)。
4

1 回答 1

3
  1. 您可以在小部件的构造函数中传递其他数据。就像是

    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_tags.

  2. 您可以使用render_to_string函数。

于 2012-05-12T11:04:45.553 回答