Quiero mostrar un menú desplegable en Django Form donde los elementos desplegables se especifican en otro modelo en otra aplicación. Esto es lo que quiero decir:
título/modelos.py
TITLE_CHOICES = ( ('MR', 'Mr'), ('MS', 'Ms'), ('MISS', 'Miss'), ('MRS', 'Mrs'), ('MX', 'Mx'), ) class Title(models.Model): title_name = models.CharField(max_length=10, choices=TITLE_CHOICES) def __str__(self): return self.title_name
usuario/modelos.py
class User(models.Model): ... user_title = models.ForeignKey('title.Title', on_delete=models.CASCADE) ...
usuario/formularios.py
class SignupForm(forms.ModelForm): user_title = forms.ModelChoiceField(queryset=Title.objects.all()) class Meta: model = User fields = '__all__' def signup(self, request, user): #this is to override the **allauth** signup form user.user_title = self.cleaned_data['title_name'] ... ... user.save()
Con el código anterior, el campo desplegable se representa correctamente; sin embargo, está vacío.
Cualquier idea o sugerencia es muy apreciada.
Gracias.
Cambie su campo de título de usuario a esto y pruebe esto.
user_title = forms.ModelChoiceField(queryset=Title.objects.all(), widget=forms.Select(attrs={'class': 'form-control'}))
Si va a crear todas las opciones en TITLE_CHOICES que declaró, solo haría un accesorio y lo cargaría en la base de datos.
Cambiaría un poco el modelo: title.models
def Title(models.Model): title_name = models.CharField(max_length=10) title = models.CharField(max_length=10) def __str__(self): return self.title_name
luego haga un archivo json: title/fixtures/titles.json
[ { "model": "title.Title", "pk": 1, "fields": { "title_name": "MR", "title" : "Mr" } }, { "model": "title.Title", "pk": 2, "fields": { "title_name": "MS", "title" : "Ms" } }, ... ]
Luego cargue este archivo json en la base de datos mediante python manage.py loaddata titles
. Esto creará automáticamente todas las instancias en el archivo json en la base de datos.
Tenga en cuenta que debe guardar el archivo en una carpeta llamada fixtures
, de lo contrario, devuelve un error.
Ahora, al crear el usuario, obtendrá el título ForeignKey
mostrará title_name
en la lista de opciones en lugar del title
.
user_title = forms.ModelChoiceField(queryset=Title.objects.all(), flat=True)