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 に答える