我正在建立一个游戏链接网站,用户可以在其中发布自己喜爱的网页游戏的链接.当人们发布游戏时,他们应该检查游戏属于哪个类别.我决定为每个游戏允许许多类别,因为一些游戏可以分为许多类别.所以问题是,我如何处理这个问题?我怎样才能将它显示为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)
应该修复你的观点,但我不确定管理员.仍在寻找...如果我找到任何东西将编辑.