through relations queryset one many foreign python django

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

Fuente de 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()


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.