2009-03-05 2 views
0

Weird проблемы в Django с формами:Джанго ForeignKey по форме с ModelChoiceField исчезает

У меня есть Form.class, определенный как это ...

class MeetingForm(forms.Form): 
    owner = forms.ModelChoiceField(
      queryset=Profile.objects.all(), 
      widget=forms.HiddenInput()) 
    date = forms.DateTimeField() 
    name = forms.CharField(max_length=30) 
    etc. 

И создать новые экземпляры путем вызова функции, как это ...

def newMeetingForm(request,profile) : 
    mf = MeetingForm({ 
     'date' : date.today(),   
     }) 
    return mf 

Работает должным образом. Кроме того, поле «владелец» на собрании пуст. То, что я думаю, что я должен сделать, это предварительно заполнить поле владельца в newMeetingForm, как это:

def newMeetingForm(request,profile) : 
    mf = MeetingForm({ 
     'date' : date.today(), 
     'owner' : profile, 
     }) 
    return mf 

где аргумент «профиль» является объектом профиля.

Однако, когда я запускаю это, форма не отображается.

Я использую это в шаблоне:

{{ form.as_p }} 

Но с этой дополнительной линии «владелец» в newMeetingForm буквально, кажется, выходит как пустая строка. Я предполагаю, что каким-то образом он терпит неудачу, возможно, поскольку ModelChoiceField пытается отобразить значение владельца, которое я предварительно заполнил. Но значения выглядят нормально. Так что еще я должен искать?

+0

По какой причине это классифицируется как wiki сообщества? Кажется, хороший вопрос. –

+0

Я просто классифицирую как сообщество по умолчанию ... в случае, если кто-то может его улучшить. – interstar

ответ

3

Ваш код выглядит правильно, в основном говоря. Я фактически запускал проект «заглушки» на своей машине с использованием кода формы и формы, который у вас есть, с успешными результатами (по общему признанию, я догадался, на что может выглядеть модель профиля).

Одна вещь, которую следует учитывать, хотя она не повлияет на рендеринг, заключается в том, что вы должны создавать экземпляр MeetingForm со словарем как данные initial. Если вы передадите его в качестве первого позиционного аргумента, django предположит, что вы хотите, чтобы эти данные были данными POST, и поэтому форма должна быть проверена. (Извиняюсь, если вы уже знаете это и где просто кратковременно для постановки вопроса).

Я часто нахожу, что взгляды django проглатывают важные ошибки. Для того, чтобы проверить вашу форму попробовать сделать это в Django оболочки:

$ python manage.py shell 
>>> from blah.models import Profile 
>>> from blah.forms import MeetingForm 
>>> from datetime import date 
>>> p = Profile.objects.get(id=someid) 
>>> mf = MeetingForm(initial={'date':date.today(), 'owner':p}) 
>>> print mf.as_p() 

Этот выход будет форма и, если существуют серьезные взрывы, ошибки, а также.

Кроме того, и я знаю, что это глупо, но я тоже делал такие вещи :-) (дополнительный набор глаз ... и т. Д.), Вы уверены, что передаете переменную 'form' в контекст для вашего шаблона? И что переменная называется «форма», а не «mf» или что-то в этом роде?

Надеюсь, что поможет

+0

да ... это было («initial =»). Большое спасибо. Некоторое время боролся с этим. – interstar

+0

Я не знал об утверждении первого аргумента в этом контексте – interstar

+0

Прохладный! Рад, что смог помочь.Gotta люблю эти пустые строки в шаблонах :-) –

0

Вы уверены, что используете данный экземпляр профиля в newMeetingForm?

+0

Я уверен, что это произошло из «request.user.get_profile()» – interstar

Смежные вопросы