2010-03-02 14 views
3

Je souhaite remplir deux champs de clés étrangères dans l'un de mes formulaires. Le bit correspondant du code est comme ci-dessous:Initialiser les listes déroulantes des clés étrangères

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     form.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number, 'addedBy': request.user, }) 

vehicle des points à la classe Vehicle. addedBy doit contenir l'utilisateur actuellement connecté.

Cependant, les listes déroulantes ne sont pas initialisées comme je veux ... Je dois encore sélectionner le véhicule et l'utilisateur. A partir de là, j'ai deux questions:

  1. Quel pourrait être le problème?
  2. Quelle est la meilleure façon de rendre ces formulaires en lecture seule?

EDIT 1 La présente jusqu'à la classe ressemble IssueForm:

class Issues(models.Model): 
    vehicle = models.ForeignKey(Vehicle) 
    description = models.CharField('Issue Description', max_length=30,) 
    type = models.CharField(max_length=10, default='Other', choices=ISSUE_CHOICES) 
    status = models.CharField(max_length=12, default='Pending', 
    choices=ISSUE_STATUS_CHOICES) 
    priority = models.IntegerField(default='8', editable=False) 
    addedBy = models.ForeignKey(User, related_name='added_by') 
    assignedTo = models.CharField(max_length=30, default='Unassigned') 
    dateTimeAdded = models.DateTimeField('Added On', default=datetime.today, 
    editable=False) 
    def __unicode__(self):  
    return self.description 

classe de forme

class IssuesForm(ModelForm): 
    class Meta: 
    model = Issues 
    exclude = ('assignedTo') 
+0

Pouvez-vous aussi montrer votre classe 'IssuesForm'? –

+0

@ Ben J'ai ajouté la classe – Stephen

+0

Vous devriez essayer de transmettre les données initiales pour l'un des autres champs, comme la description. S'il est rempli, j'imagine que le problème provient du passage dans le véhicule, contrairement à l'objet du véhicule lui-même. – Adam

Répondre

1

Pour votre deuxième question, vous êtes désireux de faire la lecture sur le terrain addedBy -seulement? Si tel est le cas, ne l'ajoutez pas à votre formulaire (il ne sera jamais en lecture seule si vous le présentez à l'utilisateur, par exemple Firebug). Vous pouvez à la place le remplir dans votre méthode de sauvegarde.

if request.method == 'POST': 
    form = IssuesForm(request.POST or None) 
    if request.method == 'POST' and form.is_valid(): 
     issue = form.save(commit=False) 
     issue.addedBy = request.user 
     # any other read only data goes here 
     issue.save() 
else: 
    form = IssuesForm(initial={'vehicle': stock_number}) # this is related to your first question, which I'm not sure about until seeing the form code 
+0

Je pensais que le «véhicule»: stock_number va initalize l'entrée de clé étrangère du véhicule – Stephen

+0

trop de contrôles pour request.method, si vous initialisez le formulaire avec (request.POST ou None) alors tout ce que vous devez faire est de vérifier is_valid() puisque le formulaire unbound (dans le cas où POST est None) n'a pas d'erreurs –

+0

@ Dmitry: Je viens de voir les nombreuses vérifications. ..Je déplaçais sur le code d'une vieille application que j'avais faite pour la même fonction ... thnx pour l'avis – Stephen

0

Pour faire une forme en lecture seule: sur votre classe de formulaire, remplacer le __init__method désactiver les champs html:

def __init__(self, *args, **kwargs): 
    super(IssuesForm, self).__init__(*args, **kwargs) 
    for key in self.fields.keys(): 
     self.fields[key].widget.attrs = {'disabled': 'disabled'} 

se assure que vous aussi ne pas écouter les requêtes POST, le cas échéant, don Ne sauvegardez pas le formulaire. Vous pouvez personnaliser davantage le __init__method pour prendre quelques arguments et définir des champs pour ces valeurs après l'appel de la super méthode.

Questions connexes