Как я могу отобразить ManyToManyField как флажки? - PullRequest
30 голосов
/ 19 ноября 2009

Я создаю сайт с ссылками на игры, где пользователи могут публиковать ссылки на свои любимая веб-игра. Когда люди публикуют игры, они должны проверять, к какой категории относится игра падает в. Я решил разрешить много категорий для каждой игры, так как некоторые игры могут попадают во многие категории. Итак, вопрос в том, как мне справиться с этим на мой взгляд? И как я могу показать это как флажки, где хотя бы один должен быть проверил? И как я могу показать это как флажки в 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) 

Просмотров: 1009 * * 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 ]

38 голосов
/ 19 ноября 2009

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

Форма:

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

(Это была часть набора запросов, которую я не смог найти ..)

Вид:

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

И это весь код, необходимый для сохранения данных.

Edit: вот решение для админа

Модель:

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)

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

Ура!

37 голосов
/ 19 ноября 2009
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')

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

0 голосов
/ 20 сентября 2018

Обнаружил это у Чейза Зайберта, технического директора Dropbox

Источник от 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...