Cela a pris plus de 7 heures sans succès. A présent, je n'ai aucune idée pourquoi.Django: Impossible de présélectionner à partir du menu d'options Sur POST
J'ai deux formes, this screenshot devrait donner une assez bonne indication du flux que je cherche. Donc, fondamentalement, un utilisateur sélectionne l'un des éléments existants dans le menu déroulant de BottleForm (marqué dans la capture d'écran "1"), ou il choisit de cliquer sur le bouton Ajouter, qui ouvre un modal d'un autre formulaire BrandForm (marqué dans la capture d'écran comme "2"), ce qui devrait lui permettre de remplir un nouveau nom de marque.
Ce que je veux, c'est que lorsqu'un nouveau nom de marque est soumis dans le BrandForm et que la page soit rechargée, cette marque est déjà présélectionnée dans le menu déroulant. J'ai lu d'innombrables discussions, mais aucune des réponses suggérées concernant le réglage initial
sur le terrain.
Pourquoi cela ne fonctionne-t-il pas?
views.py (add_brand
est le nom pour le soumettre BrandForm):
# Add brand form
elif 'add_brand' in request.POST:
brand_name = request.POST['name'] # this is the brand name we submitted
context['form'] = BottleForm(initial={'brand': brand_name})
context['form2'] = BrandForm(request.POST)
the_biz = Business.objects.filter(owner=user.id).first()
if context['form2'].is_valid():
print("brand for valid!")
brand = context['form2'].save(commit=False)
brand.business = the_biz
brand.save()
return render(request, template_name="index.pug", context=context)
bottle_form.pug:
//- Create New Brand Modal
div.modal.fade.create-new-brand(tabindex="-1" role="dialog")
div.modal-dialog.modal-sm(role="document")
div.modal-content
div.modal-header
H3 Enter the Brand's name here:
div.modal-body
form.form-horizontal(method="post" action=".")
| {% csrf_token %}
| {{ form2.as_p }}
hr
btn.btn.btn-default(type="button" data-dismiss="modal") Close
input.btn.btn-primary(type="submit" value="submit")(name="add_brand") Add Brand
models.py:
class Brand(models.Model):
name = models.CharField(max_length=150, blank=False)
business = models.ForeignKey(Business, on_delete=models.CASCADE, related_name="brands")
permissions = (
('view_brand', 'View the brand'),
('del_brand', 'Can delete a brand'),
('change_brand', 'Can change a brand\'s name'),
('create_brand', 'Can create a brand'),
)
def __str__(self):
return self.name
class Bottle(models.Model):
name = models.CharField(max_length=150, blank=False, default="")
brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name="bottles")
vintage = models.IntegerField('vintage', choices=YEAR_CHOICES, default=datetime.datetime.now().year)
capacity = models.IntegerField(default=750,
validators=[MaxValueValidator(2000, message="Must be less than 2000")
,MinValueValidator(50, message="Must be more than 50")])
slug = models.SlugField(max_length=550, default="")
@property
def age(self):
this_year = datetime.datetime.now().year
return this_year - self.vintage
permissions = (
('view_bottle', 'View the bottle'),
('del_bottle', 'Can delete a bottle'),
('change_bottle', 'Can change a bottle\'s name'),
('create_bottle', 'Can create a bottle'),
)
def __str__(self):
return self.name + " " + self.brand.name + " " + str(self.capacity) + " " + str(self.vintage)
def save(self, *args, **kwargs):
# if there's no slug, add it:
if self.slug == "":
self.slug = str(slugify(str(self.name)) + slugify(str(self.brand)) + str(self.vintage) + str(self.capacity))
super(Bottle, self).save(*args, **kwargs)
Si plus de détails sont nécessaires s'il vous plaît faites le moi savoir. Ça me rend fou.
BTW: Je n'ai aucune idée de la manière dont Django charge les options dans un menu déroulant.