python - relations - ¿Cómo puedo representar un ManyToManyField como casillas de verificación?
one to one relations django (4)
+1 para la parte de administrador en la respuesta @ Grétar Jónsson. Sólo una pequeña corrección:
En la sección "Modelos:" también necesita importar modelos:
from django.db import models
(Un poco tonto que necesitas reputación para comentar directamente en las publicaciones de otras personas)
Estoy creando un sitio de enlaces de juegos, donde los usuarios pueden publicar enlaces a sus juegos web favoritos. Cuando las personas publican juegos, se supone que deben verificar en qué categoría se encuentra el juego. Decidí permitir muchas categorías para cada juego ya que algunos juegos pueden caer en muchas categorías. Entonces, la pregunta es, ¿cómo manejo esto en mi opinión? ¿Y cómo puedo mostrarlo como Casillas de verificación, donde se debe marcar al menos una? ¿Y cómo puedo mostrar esto también como casillas de verificación en el administrador?
Aquí está el código
Modelos:
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)
Puntos de vista:
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),)
Formas:
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'')
¡Gracias!
Así es como lo resolví (Edición: y la cosa del administrador)
Formas:
cats = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple, queryset=Category.objects.all())
(Era la parte queryset que no pude encontrar ...)
Ver:
cats = form.cleaned_data[''cats'']
game.cats = cats
Y eso es todo el código necesario para guardar los datos.
Edit: aquí hay una solución para el administrador.
Modelos:
from django.contrib import admin
from django.forms import CheckboxSelectMultiple
class MyModelAdmin(admin.ModelAdmin):
formfield_overrides = {
models.ManyToManyField: {''widget'': CheckboxSelectMultiple},
}
Administración:
from gamesite.games.models import Game, MyModelAdmin
admin.site.register(Game, MyModelAdmin)
Es un poco peculiar en apariencia, pero funciona! Si alguien encuentra una manera de hacerlo más "limpio", por favor publique!
¡Aclamaciones!
Encontré esto en Chase Seibert, Gerente de Ingeniería de Dropbox
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()
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'')
Eso debería arreglar tu vista, pero no estoy seguro sobre el administrador. Sigo buscando ... editaré si encuentro algo.