如何将ManyToManyField呈现为复选框?

Gré*_*son 31 python django

我正在建立一个游戏链接网站,用户可以在其中发布自己喜爱的网页游戏的链接.当人们发布游戏时,他们应该检查游戏属于哪个类别.我决定为每个游戏允许许多类别,因为一些游戏可以分为许多类别.所以问题是,我如何处理这个问题?我怎样才能将它显示为Checkboxes,其中至少有一个必须被检查?如何在管理员中将其显示为复选框?

这是代码

楷模:

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) 
Run Code Online (Sandbox Code Playgroud)

浏览次数:

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),)
Run Code Online (Sandbox Code Playgroud)

形式:

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')
Run Code Online (Sandbox Code Playgroud)

谢谢!

Gré*_*son 39

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

形式:

cats = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Category.objects.all())
Run Code Online (Sandbox Code Playgroud)

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

视图:

cats = form.cleaned_data['cats']
    game.cats = cats
Run Code Online (Sandbox Code Playgroud)

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

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

楷模:

from django.contrib import admin
from django.forms import CheckboxSelectMultiple

class MyModelAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': CheckboxSelectMultiple},
    }
Run Code Online (Sandbox Code Playgroud)

管理员:

from gamesite.games.models import Game, MyModelAdmin

admin.site.register(Game, MyModelAdmin)
Run Code Online (Sandbox Code Playgroud)

它看起来有点古怪,但有效!如果有人找到让它更"干净"的方法,请发布!

干杯!


Bra*_*nry 37

class GameForm(forms.ModelForm): 
        name = forms.CharField(max_length=15, label='Name') 
        url = forms.URLField(label='URL', initial='http://') 
        cats = forms.ModelMultipleChoiceField(
            widget=forms.CheckboxSelectMultiple,
            required=True)

        class Meta: 
                model = Game 
                fields = ('name','url','cats')
Run Code Online (Sandbox Code Playgroud)

应该修复你的观点,但我不确定管理员.仍在寻找...如果我找到任何东西将编辑.

  • 我无法在django 1.3中使用它,但以下应该可以工作:cats = forms.ModelMultipleChoiceField(queryset = Category.objects.all(),widget = forms.CheckboxSelectMultiple(),required = True) (6认同)