Tengo un formulario para enviar nuevos artículos en Django, en este formulario se le permite colocar la publicación en un 'user_group', solo una relación de muchos, muchos entre grupos y usuarios. Sin embargo, solo puede agregarlo a los grupos a los que pertenece. Usando la función de inicio de la clase de formulario, puedo pasar un campo adicional, y obtengo las opciones correctas que necesito, sin embargo, al enviar, aparece el error "QueryDict" El objeto no tiene el atributo "todos".
No estoy seguro de lo que va mal, aquí está mi formulario:
class PostForm(BaseModelForm): new_image = forms.ImageField(required=False) #GROUPS = user.groups.all() #group = forms.ChoiceField(choices=GROUPS, required=False ) def __init__(self,groups, *args, **kwargs): super(PostForm, self).__init__(*args, **kwargs) self.fields['group'].queryset = groups class Meta: model = Post fields = ('title','category', 'group', 'text', 'description', 'style') help_texts = { 'group': _('Do you want this published under your account or a group?') }y aquí está la vista donde se arroja el error:
@login_required def post_new(request): if request.method == "POST": form = PostForm(request.POST, request.FILES) if form.is_valid(): post = form.save(commit=False) post.author = request.user post.save() return redirect('post_detail', pk=post.pk) else: form = PostForm(groups=request.user.user_groups.all()) return render(request, 'blog/post_edit.html', {'form': form})Esta línea:
form = PostForm(groups=request.user.user_groups.all())Es donde paso las opciones para grupos, lo que te da las opciones correctas. El hecho de que el error ocurra al enviar me hace pensar que es un error en la forma en que la vista lo procesa, pero no estoy seguro de dónde.
Debe pasar groups al formulario para solicitudes GET y POST . Por el momento, solo lo está haciendo para solicitudes GET. Debería ser
if request.method == "POST": form = PostForm(request.user.user_groups.all(), request.POST, request.FILES) ...Creo que tienes que consultar los grupos en el formulario:
class PostForm(models.ModelForm): group = forms.ChoiceField(queryset = None) def __init__(self,groups, *args, **kwargs): super(PostForm, self).__init__(*args, **kwargs) self.fields['group'].queryset = request.user.user_groups.all()https://docs.djangoproject.com/en/1.11/ref/forms/fields/#fields-which-handle-relationships
Es importante definir queryset como Ninguno, y en __init__ realizar la consulta cuando se crea la instancia del formulario.