Как я могу сделать 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')
Спасибо!
Ответы
Ответ 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
(Немного глупо, что вам нужна репутация, чтобы комментировать прямо на других языках)