Django: Form.save () INSERT не будет работать, только ОБНОВЛЕНИЕ - PullRequest
0 голосов
/ 28 августа 2011

хорошо, поэтому я перехожу к представлению «creation_add», я ввожу значения в поля формы Django, затем отправляю.

Success, создается новая запись о занятости, и страница перезагружается с пустой формой.

Когда я ввожу значения и отправляю второй раз, он обновляется; несмотря на то, что я не передаю экземпляр в форму, и он не связан.

Мне бы хотелось, чтобы вместо этого была создана новая запись о занятости.

Есть предложения? Спасибо за вашу помощь.

--- UPDATE ---

Исходя из ответа Раджива: я не понимаю, откуда Джанго получает UUID предыдущего объекта. Может кто-нибудь объяснить, где в RequestContext эта информация хранится? В форме или данных POST нет поля uuid (pk), и я не могу найти его нигде в RequestContext. Я не передаю экземпляр формы сценарий ... любое объяснение будет высоко ценится

--- UPDATE --- Эта проблема, по-видимому, возникает в момент создания Employment в представлении Employment_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 ]

3 голосов
/ 29 августа 2011

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

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

0 голосов
/ 28 августа 2011

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

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

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

...