3 Stimmen

Fremdschlüssel-Dropdowns initialisieren

Ich möchte zwei Fremdschlüsselfelder in einem meiner Formulare ausfüllen. Der entsprechende Teil des Codes lautet wie folgt:

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 zeigt auf den Vehicle Klasse. addedBy soll den aktuell angemeldeten Benutzer enthalten.

Allerdings sind die Dropdowns nicht so initialisiert, wie ich es möchte...ich muss immer noch das Fahrzeug und den Benutzer auswählen. Daher habe ich zwei Fragen:

  1. Was könnte das Problem sein?
  2. Wie kann ich diese Formulare am besten schreibgeschützt machen?

EDIT 1 Le site IssueForm Klasse sieht bisher so aus:

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

Formular Klasse

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

1voto

Adam Punkte 6589

Für Ihre zweite Frage, wollen Sie das Feld addedBy schreibgeschützt machen? Wenn ja, fügen Sie es nicht in Ihr Formular ein (es wird niemals schreibgeschützt sein, wenn Sie es dem Benutzer präsentieren, z. B. mit Firebug). Sie können es stattdessen innerhalb Ihrer Speichermethode auffüllen.

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

0voto

Luiz C. Punkte 738

Um ein Formular schreibgeschützt zu machen: Überschreiben Sie in Ihrer Formularklasse die __init__Methode, um HTML-Felder zu deaktivieren:

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

Vergewissern Sie sich, dass Sie auch nicht auf POST-Anfragen warten, und speichern Sie das Formular nicht. Sie können die __init__Methode weiter anpassen, um einige Argumente zu übernehmen und Felder auf diese Werte zu setzen, nachdem die Supermethode aufgerufen wurde.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X