Как я могу сделать ManyToManyField как флажки?

Я делаю сайт ссылки на игру, где пользователи могут размещать ссылки на свою любимую веб-игру. Когда люди отправляют игры, они должны проверить, в какую категорию попадает игра. Я решил разрешить много категорий для каждой игры, так как некоторые игры могут попадать во многие категории. Итак, вопрос в том, как я могу справиться с этим на мой взгляд? И как я могу показать его как флажки, где, по крайней мере, нужно проверить? И как я могу показать это как флажки в Admin, а?

Вот код

Модели:

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') 

Благодаря!

3 Solutions collect form web for “Как я могу сделать ManyToManyField как флажки?”

 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') 

что должно исправить ваше мнение, но я не уверен в этом. все еще глядя … будет редактировать, если я найду что-нибудь.

Вот как я это решил (Edit: and admin thing)

Формы:

 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) 

Это своего рода причудливая внешность, но работает! Если кто-то найдет способ сделать его более «чистым», напишите!

Ура!

+1 для админ-части в ответ @ Grétar Jónsson. Просто небольшая коррекция:

В разделе «Модели:» вам также нужно импортировать модели:

 from django.db import models 

(Немного глупо, что вам нужна репутация, чтобы комментировать прямо на других языках)

Python - лучший язык программирования в мире.