Хорошо, поэтому я перехожу к представлению «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) 
0
just__matt 28 Авг 2011 в 09:11

2 ответа

Лучший ответ

Проблема, похоже, в default=make_uuid(). Это запускает make_uuid только один раз при создании класса модели и передает одно сгенерированное значение (не функцию) в качестве значения по умолчанию для поля. Каждый раз, когда вы создаете экземпляр, используется одно и то же значение по умолчанию.

Вместо этого вы должны передать вызываемый объект по умолчанию, например: default=make_uuid.

3
rczajka 29 Авг 2011 в 19:32

В конце вашего кода:

else:
    form = EmploymentForm()
return render_to_response("employment_add.html", {'form': form},   context_instance)

Удалите context_instance из вызова render_to_response. Этот экземпляр контекста содержит отправленные данные формы и предварительно заполняет форму во второй раз.

0
Rajiv Makhijani 28 Авг 2011 в 05:51