Хорошо, поэтому я перехожу к представлению «usage_add», ввожу значения в поля формы Django, а затем отправляю.
Успешно, создается новая запись о занятости, и страница перезагружается с пустой формой.
Когда я ввожу значения и отправляю второй раз, он обновляется; хотя я не передаю экземпляр в форму, и он не привязан.
Я бы хотел вместо этого создать новую трудовую книжку.
Какие-либо предложения? Спасибо за вашу помощь.
---ОБНОВИТЬ---
Следуя ответу Раджива: я не понимаю, откуда Django получает uuid предыдущего объекта. может кто-нибудь объяснить, где в RequestContext хранится эта информация? В форме или данных POST нет поля uuid (pk), и я не могу найти его нигде в RequestContext. Я не передаю экземпляр в форму ни в одном из сценариев ... любое объяснение будет очень признательно
--- ОБНОВЛЕНИЕ --- Проблема, по-видимому, возникла при создании экземпляра занятости в представлении usage_add. См. Трассировку pdb под кодом
===MODELS===
###User Model is provided by Django
import uuid
def make_uuid():
return str(uuid.uuid4())
class __base__(models.Model):
uuid = models.CharField(max_length=36, primary_key=True,
default=make_uuid(), editable=False)
#max_length must be 36. uuid4 generates a 36 character key
class Meta:
abstract = True
class Employment(__base__):
user = models.ForeignKey( User, related_name='employment')
### employment related fields - no other PK or FK
===FORM===
class EmploymentForm(ModelForm):
class Meta:
model = Employment
exclude = ('user')
widgets = {
}
===VIEW===
def employment_add(request):
context_instance = RequestContext(request)
u = request.user
if request.method == 'POST':
message=""
form = EmploymentForm(request.POST)
if form.is_valid():
f = form.save(commit=False)
f.user = u
f.save()
message = "Position Added"
form = EmploymentForm()
return render_to_response("employment_add.html", {'form':form, 'message':message}, context_instance)
else:
em = Employment()
#start pdb trace here
form = EmploymentForm(instance=em)
return render_to_response("employment_add.html", {'form': form}, context_instance)
===pdb trace===
(Pdb) em
<Employment: Employment object>
(Pdb) em.uuid
u'260015bc-c2eb-4cc1-9506-75e312027404'
(Pdb) c
[29/Aug/2011 14:15:25] "GET /person/employment/add HTTP/1.1" 200 4425
[29/Aug/2011 14:15:33] "POST /person/employment/add HTTP/1.1" 302 0
<QueryDict: {u'month_start': [u''], u'year_start': [u''], u'year_end': [u''], u'employer': [u'66'], u'details': [u'6'], u'month_end': [u''], u'position': [u'66'], u'csrfmiddlewaretoken': [u'9e9c6b2ac43c370f993cb3f72682c7ea'], u'city_town': [u'']}>
[29/Aug/2011 14:15:33] "GET /person/view?i=1 HTTP/1.1" 200 9255
(Pdb) em
<Employment: Employment object>
(Pdb) em.uuid
u'260015bc-c2eb-4cc1-9506-75e312027404'
(Pdb)
2 ответа
Проблема, похоже, в default=make_uuid()
. Это запускает make_uuid
только один раз при создании класса модели и передает одно сгенерированное значение (не функцию) в качестве значения по умолчанию для поля. Каждый раз, когда вы создаете экземпляр, используется одно и то же значение по умолчанию.
Вместо этого вы должны передать вызываемый объект по умолчанию, например: default=make_uuid
.
В конце вашего кода:
else:
form = EmploymentForm()
return render_to_response("employment_add.html", {'form': form}, context_instance)
Удалите context_instance
из вызова render_to_response. Этот экземпляр контекста содержит отправленные данные формы и предварительно заполняет форму во второй раз.
Похожие вопросы
Новые вопросы
django
Django - это серверная платформа веб-приложений с открытым исходным кодом, написанная на Python. Он разработан для сокращения усилий, необходимых для создания сложных веб-сайтов и веб-приложений, управляемых данными, с особым упором на меньшее количество кода, отсутствие избыточности и более явное, чем неявное.