2017-10-18 8 views
0

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.

Répondre

2

Il semble que votre modèle Brand ait le champ brand en tant que ForeignKey. Cela signifie que lorsque vous passez brand_name comme valeur initiale à brand dans votre BottleForm, il ne sait pas quoi faire car il attend une ForeignKey, pas une chaîne. Dans ce cas, ce que vous devez faire est lorsque vous ajoutez un nouveau brand_name, vous devez d'abord créer et enregistrer l'instance de modèle Brand, puis obtenir cette instance que vous venez d'enregistrer, puis passez-la à votre paramètre initial.

est ici un code pour commencer à partir de:

elif 'add_brand' in request.POST: 
    brand_name = request.POST['name'] # this is the brand name we submitted 
    b = Brand(name=brand_name, business=...) # you will have to figure out what Business object to set considering that is a ForeignKey. 
               # Alternatively, you can define a default for your `business` field, 
               # e.g. default=1, where 1 refers to the pk of that business object 
    b.save() 
    new_brand = Brand.objects.last() # grabs the last Brand object that was saved 
    context['form'] = BottleForm(initial={'brand': new_brand}) 
    ... # rest of the magic here