Estou com problemas para tentar entender como criar um campo de escolha dinâmica no django. Eu tenho um modelo configurado algo como:
class rider(models.Model):
user = models.ForeignKey(User)
waypoint = models.ManyToManyField(Waypoint)
class Waypoint(models.Model):
lat = models.FloatField()
lng = models.FloatField()
O que estou tentando fazer é criar um campo de escolha cujos valores sejam os waypoints associados a esse piloto (que seria a pessoa logada).
Atualmente estou substituindo init em meus formulários da seguinte forma:
class waypointForm(forms.Form):
def __init__(self, *args, **kwargs):
super(joinTripForm, self).__init__(*args, **kwargs)
self.fields['waypoints'] = forms.ChoiceField(choices=[ (o.id, str(o)) for o in Waypoint.objects.all()])
Mas tudo o que faz é listar todos os waypoints, eles não estão associados a nenhum piloto em particular. Alguma ideia? Obrigado.
python
django
django-forms
django-templates
O que, o que
fonte
fonte
CheckboxSelectMultiple
widget com isso, useMultipleChoiceField
ouModelMultipleChoiceField
. No começo, parece funcionarChoiceField
, mas os internos serão interrompidos quando você tentar salvar o formulário.CheckboxSelectMultiple
widget com este código. Certifique-se de alterarChoiceForm
paraMultipleChoiceForm
Existe uma solução interna para o seu problema: ModelChoiceField .
Geralmente, sempre vale a pena tentar usar
ModelForm
quando você precisa criar / alterar objetos de banco de dados. Funciona em 95% dos casos e é muito mais limpo do que criar sua própria implementação.fonte
o problema é quando você faz
em uma solicitação de atualização, o valor anterior será perdido!
fonte
Que tal passar a instância rider para o formulário enquanto a inicializa?
fonte
Debaixo da solução de trabalho com campo de escolha normal. meu problema era que cada usuário tinha suas próprias opções de campo de escolha PERSONALIZADAS com base em poucas condições.
fonte
Conforme apontado por Breedly e Liang, a solução da Ashok impedirá que você obtenha o valor selecionado ao postar o formulário.
Uma maneira um pouco diferente, mas ainda imperfeita, de resolver isso seria:
Isso pode causar alguns problemas de simultaneidade.
fonte
Você pode declarar o campo como um atributo de primeira classe do seu formulário e apenas definir opções dinamicamente:
Você também pode usar um ModelChoiceField e definir o conjunto de consultas no init de maneira semelhante.
fonte
Se você precisar de um campo de escolha dinâmica no django admin; Isso funciona para django> = 2.1.
Espero que isto ajude.
fonte