Подтвердить что ты не робот

Как я могу сделать 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')

Спасибо!

4b9b3361

Ответ 1

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

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

Ответ 2

Вот как я его решил (Edit: and the 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)

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

Ура!

Ответ 3

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

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

from django.db import models

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