modelformset_factory modelchoicefield form foreign fields create all django django-models django-forms foreign-keys

django - modelchoicefield - modelformset_factory



¿Cómo agrego un campo de clave externa a un ModelForm en Django? (1)

En lo que respecta a mostrar un campo de clave foránea en un formulario, puede utilizar los forms.ModelChoiceField y pasarle un queryset.

entonces, forms.py:

class DocumentForm(forms.ModelForm): class Meta: model = Document def __init__(self, *args, **kwargs): user = kwargs.pop(''user'','''') super(DocumentForm, self).__init__(*args, **kwargs) self.fields[''user_defined_code'']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user))

views.py:

def someview(request): if request.method==''post'': form=DocumentForm(request.POST, user=request.user) if form.is_valid(): selected_user_defined_code = form.cleaned_data.get(''user_defined_code'') #do stuff here else: form=DocumentForm(user=request.user) context = { ''form'':form, } return render_to_response(''sometemplate.html'', context, context_instance=RequestContext(request))

de su pregunta:

Sé que en una vista puede usar document.code_set (por ejemplo) para acceder a los objetos relacionados para el objeto de documento actual, pero no estoy seguro de cómo aplicar esto a un ModelForm.

En realidad, sus objetos de Document no tendrían un .code_set ya que la relación FK está definida en su modelo de documentos. Está definiendo una relación de muchos a uno con el Code , lo que significa que puede haber muchos objetos de Document por objeto de Code , y no al revés. Sus objetos de Code tendrían un .document_set . Lo que puede hacer desde el objeto de documento es acceder a qué Code está relacionado con el uso de document.code .

Edición: Creo que esto hará lo que buscas. (no probado)

forms.py:

class DocumentForm(forms.ModelForm): class Meta: model = Document exclude = (''code'',) def __init__(self, *args, **kwargs): user = kwargs.pop(''user'','''') super(DocumentForm, self).__init__(*args, **kwargs) self.fields[''user_defined_code'']=forms.ModelChoiceField(queryset=UserDefinedCode.objects.filter(owner=user)) self.fields[''unique_code'']=forms.CharField(max_length=15)

views.py:

def someview(request): if request.method==''post'': form=DocumentForm(request.POST, user=request.user) if form.is_valid(): uniquecode = form.cleaned_data.get(''unique_code'') user_defined_code = form.cleaned_data.get(''user_defined_code'') doc_code = Code(user_defined_code=user_defined_code, code=uniquecode) doc_code.save() doc = form.save(commit=False) doc.code = doc_code doc.save() return HttpResponse(''success'') else: form=DocumentForm(user=request.user) context = { ''form'':form, } return render_to_response(''sometemplate.html'', context, context_instance=RequestContext(request))

en realidad, es probable que desee utilizar get_or_create al crear su objeto Code en lugar de esto.

doc_code = Code(user_defined_code=user_defined_code, code=uniquecode)

Lo que me gustaría hacer es mostrar una única forma que permita al usuario:

  • Introduzca un título de documento (del modelo de Document )
  • Seleccione una de sus opciones de UserDefinedCode de una lista desplegable (completada por el modelo UserDefinedCode )
  • Escriba un unique_code (almacenado en el modelo de Code )

No estoy seguro de cómo mostrar los campos de las relaciones de clave externa en un formulario. Sé que en una vista puede usar document.code_set (por ejemplo) para acceder a los objetos relacionados para el objeto de document actual, pero no estoy seguro de cómo aplicar esto a un ModelForm.

Mi modelo:

class UserDefinedCode(models.Model): name = models.CharField(max_length=8) owner = models.ForeignKey(User) class Code(models.Model): user_defined_code = models.ForeignKey(UserDefinedCode) unique_code = models.CharField(max_length=15) class Document(models.Model): title = models.CharField(blank=True, null=True, max_length=200) code = models.ForeignKey(Code) active = models.BooleanField(default=True)

Mi ModelForm

class DocumentForm(ModelForm): class Meta: model = Document