【问题标题】:How can I render a ManyToManyField as checkboxes?如何将 ManyToManyField 呈现为复选框?
【发布时间】:2010-12-18 03:22:35
【问题描述】:

我正在制作一个游戏链接网站,用户可以在其中发布指向他们的游戏的链接 最喜欢的网页游戏。 当人们发布游戏时,他们应该检查哪个类别 游戏陷入。 我决定为每个游戏允许多个类别,因为有些游戏可以 分为很多类别。 所以问题是,在我看来,我该如何处理? 以及如何将其显示为复选框,其中至少必须有一个 检查? 以及如何在管理员中将其显示为复选框?

这里是代码

型号:

class Category(models.Model): 
        category = models.CharField(max_length=200) 
        def __unicode__(self): 
                return self.category 
class Game(models.Model): 
    name = models.CharField(max_length=200) 
    url = models.CharField(max_length=200) 
    poster = models.ForeignKey(User, related_name='game_poster_set') 
    postdate = models.DateTimeField(default=datetime.now) 
    cats = models.ManyToManyField(Category) 
    hits = models.IntegerField(default=0) 
    post = models.BooleanField(default=False) 

观看次数:

def submit(request): 
        form = GameForm(request.POST or None) 
        if form.is_valid(): 
                game = form.save(commit=False) 
                game.poster = request.user 
                game.save() 
                next = reverse('gamesite.games.views.favorites') 
                return HttpResponseRedirect(next) 
        return render_to_response( 
        'games/submit.html', 
        {'form': form}, 
        context_instance = RequestContext(request),)

表格:

class GameForm(forms.ModelForm): 
        name = forms.CharField(max_length=15, label='Name') 
        url = forms.URLField(label='URL', initial='http://') 
        class Meta: 
                model = Game 
                fields = ('name','url')

谢谢!

【问题讨论】:

    标签: python django


    【解决方案1】:
    class GameForm(forms.ModelForm): 
            name = forms.CharField(max_length=15, label='Name') 
            url = forms.URLField(label='URL', initial='http://') 
            cats = forms.ModelMultipleChoiceField(
                queryset=Category.objects.all(),
                widget=forms.CheckboxSelectMultiple,
                required=True)
    
            class Meta: 
                    model = Game 
                    fields = ('name','url','cats')
    

    这应该可以解决您的观点,但我不确定管理员。仍在寻找...如果我找到任何东西,我会编辑。

    【讨论】:

    • 这不是你想要做的,但我现在没有时间转换它。尝试操纵此链接以匹配您要执行的操作。 kryogenix.org/days/2008/03/28/…
    • 我无法在 django 1.3 中使用它,但以下应该可以使用:cats = forms.ModelMultipleChoiceField(queryset=Category.objects.all(),widget=forms.CheckboxSelectMultiple(),required =真)
    • TypeError: __init__() 缺少 1 个必需的位置参数:'queryset'
    【解决方案2】:

    这是我解决它的方法(编辑:和管理员)

    表格:

    cats = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Category.objects.all())
    

    (这是我找不到的查询集部分..)

    查看:

    cats = form.cleaned_data['cats']
        game.cats = cats
    

    这就是保存数据所需的所有代码。

    编辑: 这是管理员的解决方案

    型号:

    from django.contrib import admin
    from django.forms import CheckboxSelectMultiple
    
    class MyModelAdmin(admin.ModelAdmin):
        formfield_overrides = {
            models.ManyToManyField: {'widget': CheckboxSelectMultiple},
        }
    

    管理员:

    from gamesite.games.models import Game, MyModelAdmin
    
    admin.site.register(Game, MyModelAdmin)
    

    它的外观有点古怪,但很有效! 如果有人找到使它更“干净”的方法,请发布!

    干杯!

    【讨论】:

    • 哦,呵呵!我不把查询集部分放在我的解决方案中是不好的。
    • 感谢您的管理面板解决方案。我想知道是否有一种方法可以选择排序顺序并将 sorl-thumbnail 集成到其中。有什么线索吗?
    • 嗨,我使用Country 类而不是Category & 在模板文件中我使用{{ form.countries }} 生成了复选框,它显示了复选框,但它显示了@ 987654328@。你能帮忙吗?
    • 由于它完美无缺,我确实有一个问题,我有什么办法可以从模板中的类别模型中选择要显示的字段?
    【解决方案3】:

    在 Dropbox 工程经理 Chase Seibert 处找到此内容

    Source from Chase Seibert

    from django.db import models
    from django.forms.models import ModelForm
    from django.forms.widgets import CheckboxSelectMultiple
    
    class Company(models.Model):  
        industries = models.ManyToManyField(Industry, blank=True, null=True)
    
    class CompanyForm(ModelForm):
    
        class Meta:
            model = Company
            fields = ("industries")
    
        def __init__(self, *args, **kwargs):
    
            super(CompanyForm, self).__init__(*args, **kwargs)
    
            self.fields["industries"].widget = CheckboxSelectMultiple()
            self.fields["industries"].queryset = Industry.objects.all()
    

    【讨论】:

      猜你喜欢
      • 2017-10-14
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多