Инициализировать выпадающий список внешних ключей - PullRequest
3 голосов
/ 02 марта 2010

Я хочу заполнить два поля внешнего ключа в одной из моих форм. Соответствующий бит кода приведен ниже:

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 указывает на класс Vehicle. addedBy должен содержать текущего пользователя.

Однако выпадающие не инициализируются так, как я хочу ... Мне все еще нужно выбрать автомобиль и пользователя. Отсюда у меня два вопроса:

  1. В чем может быть проблема?
  2. Как лучше всего сделать эти формы доступными только для чтения?

РЕДАКТИРОВАТЬ 1 Класс 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

Форма класса

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

Ответы [ 2 ]

1 голос
/ 02 марта 2010

Что касается вашего второго вопроса, хотите ли вы сделать поле addBy доступным только для чтения? Если это так, не добавляйте его в свою форму (он никогда не будет доступен только для чтения, если вы представите его пользователю, например Firebug). Вместо этого вы можете заполнить его внутри метода сохранения.

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 голосов
/ 02 марта 2010

Чтобы сделать форму доступной только для чтения: в своем классе формы перезапишите метод __init__, чтобы отключить поля 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'}

Гарантирует, что вы также не слушаете POST-запросы, если это так, не сохраняйте форму. Вы можете дополнительно настроить метод __init__ так, чтобы он принимал некоторые аргументы и устанавливал поля в эти значения после вызова супер-метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...