Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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 扩展表单。选择多个而不丢失值_Python_Django_Django Forms - Fatal编程技术网

Python 扩展表单。选择多个而不丢失值

Python 扩展表单。选择多个而不丢失值,python,django,django-forms,Python,Django,Django Forms,我有一个模型表单,我正在为其编写一个自定义小部件,以替换多对多表单。请使用jQuery FCBKcomplete小部件选择多个字段。虽然multiselect元素的替换工作正常,但它不再为multiselect提取选项 这是我的小部件: class FCBKcompleteWidget(forms.SelectMultiple): def _media(self): return forms.Media(js=(reverse('appstatic',

我有一个模型表单,我正在为其编写一个自定义小部件,以替换多对多表单。请使用jQuery FCBKcomplete小部件选择多个字段。虽然multiselect元素的替换工作正常,但它不再为multiselect提取选项

这是我的小部件:

class FCBKcompleteWidget(forms.SelectMultiple):
    def _media(self):
        return forms.Media(js=(reverse('appstatic',
                                       args=['js/jquery.fcbkcomplete.min.js']),
                               reverse('appstatic',
                                       args=['js/init-fcbkcomplete.js'])),
                           css={'all': (reverse('appstatic',
                                                args=['css/jquery.fcbkcomplete'
                                                      '.css']),)})

    media = property(_media)
这是我的表格:

class BlogForm(forms.ModelForm):
    class Meta(object):
        model = models.Blog
        exclude = ('slug',)

    def __init__(self, *args, **kwargs):
        super(BlogForm, self).__init__(*args, **kwargs)
        self.fields['description'].widget = TinyMCEWidget()

        fcbkcomplete_fields = ['categories', 'admins', 'editors']

        for field in fcbkcomplete_fields:
            self.fields[field].widget = FCBKcompleteWidget()
以下是我的模型:

class Category(models.Model):
    """A blog category"""

    title = models.CharField(max_length=128)
    slug = models.SlugField()

    class Meta(object):
        verbose_name_plural = u'Categories'

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('category', (), {'slug': self.slug})


class Blog(models.Model):
    """A blog"""

    title = models.CharField(max_length=128)
    slug = models.SlugField(unique=True)
    description = models.TextField()
    categories = models.ManyToManyField(Category, related_name='blogs')
    shared = models.BooleanField()
    admins = models.ManyToManyField(User, related_name='blog_admins')
    editors = models.ManyToManyField(User, related_name='blog_editors')

    def __unicode__(self):
        return self.title

    @models.permalink
    def get_absolute_url(self):
        return ('blog', (), {'slug': self.slug})
以下是生成的HTML:

<div class="field">
  <label for="name">Categories</label>
  <select multiple="multiple" name="categories" id="id_categories">
  </select>
  <div class="help-text">trimmed for readability</div>
</div>
<div class="field">
  <label for="name">Admins</label>
  <select multiple="multiple" name="admins" id="id_admins">
  </select>
  <div class="help-text">trimmed for readability</div>
</div>
<div class="field">
  <label for="name">Editors</label>
  <select multiple="multiple" name="editors" id="id_editors">
  </select>
  <div class="help-text">trimmed for readability</div>
</div>

类别
为可读性而修剪
管理员
为可读性而修剪
编辑
为可读性而修剪
正如您所看到的,没有一个选项将其添加到multiselect元素中。以下是我不使用自定义小部件替换小部件时生成的HTML:

<div class="field">
  <label for="name">Categories</label>
  <select multiple="multiple" name="categories" id="id_categories">
    <option value="1" selected="selected">Good Stuff</option>
  </select>
  <div class="help-text">trimmed</div>
</div>
<div class="field">
  <label for="name">Admins</label>
  <select multiple="multiple" name="admins" id="id_admins">
    <option value="2" selected="selected">username</option>
    <option value="3">some username</option>
    <option value="4">another username</option>
  </select>
  <div class="help-text">trimmed</div>
</div>
<div class="field">
  <label for="name">Editors</label>
  <select multiple="multiple" name="editors" id="id_editors">
    <option value="2" selected="selected">username</option>
    <option value="3">some username</option>
    <option value="4">another username</option>
  </select>
  <div class="help-text">trimmed</div>
</div>

类别
好东西
修剪
管理员
用户名
一些用户名
另一个用户名
修剪
编辑
用户名
一些用户名
另一个用户名
修剪

有没有人对为什么这些选项没有通过widget替换过程提出任何建议?任何帮助都将不胜感激。

一年过去了,但即使使用当前的django版本,答案也可能很有价值

这种行为的原因似乎是fcbk字段缺少CHOICES属性 只要把选择推到表单上就行了

class EmailSubscriptionFilterForm(forms.ModelForm):

    class Meta:
        model = EmailSubscription
        exclude = ('dsts',)

    def loc_name(self, id):
        return Location.objects.get(id = id).name           

    def __init__(self, *args, **kwargs):
        super(EmailSubscriptionFilterForm, self).__init__(*args, **kwargs)
        fcbkcomplete_fields = ['orgs']
        for field in fcbkcomplete_fields:
            self.fields[field].widget = MultiOriginSelect()
        if args:
            self.fields['orgs'].choices = ([(int(o), self.loc_name(int(o))) for o in args[0].getlist('orgs')] )

对于init,它会将POST请求附带的所有选项添加到选择主体。

由于表单是ModelForm,因此代码模型将非常有用。您解决了这个问题吗?我也有一个类似的问题,我最终只是在表单的init语句中手动提取值,并向字段提供选项。它很难看,而且绝对不是完美的,但在大多数情况下都有效。现在,我正在使用jQuery插件。