2012-06-12 4 views
1

Я пытаюсь сделать вид, где пользователь может редактировать записи БД через форму в шаблоне. Я искал много веб-страниц (и Django docs), где они учат, как делать эти представления, но они всегда используют «id», который Django генерирует для каждой модели. В этой конкретной модели я должен использовать AutoField для переопределения «id». Есть ли способ использовать этот AutoField как «id» записи с Django?Django: Edit ModelForm с помощью AutoField

Вот моя полная модель:

class T031003 (models.Model): 
    C003IDCD = AutoField(primary_key=True) 
    C003INST = models.IntegerField(unique=True) #usar AutoSlug 
    C003TPCD = models.CharField(max_length=1) 
    C003CHCD = models.CharField(max_length=14) 
    C003MTR = models.CharField(max_length=30, blank=True, null=True) 
    C003CTCD = models.CharField(max_length=3) 
    C003RZSC = models.CharField(max_length=60, blank=True, null=True) 
    C003EML = models.EmailField(max_length = 254, blank=True, null=True) 
    C003LOGA = models.CharField(max_length=20) 
    C003LOGB = models.DateTimeField() 
    C003LOGD = models.CharField(max_length=15, blank=True, null=True) 
    C003LOGF = models.CharField(max_length=20, blank=True, null=True) 

    def __unicode__(self): 
     return '%s' % self.C003MTR 

    class T031003Form(ModelForm): 
     class Meta: 
      model = T031003 
      ordering = ["-C003MTR"] 
      exclude = ('C003LOGA','C003LOGB','C003LOGD','C003LOGE','C003LOGF') 

А вот вид я пытался сделать, но это дает мне ошибку «Нет T031003 не соответствует данному запросу.» и это правильно, поскольку в таблице нет «идентификатора»:

def t031003form_edit(request, id=None): 
pin = get_object_or_404(T031003, pk=id) 
form = T031003Form(request.POST or None, instance=pin) 
if request.method == 'POST': 
    if form.is_valid(): 
     form = form.save(False) 
     form.C003LOGA = request.user 
     form.C003LOGB = datetime.date.today() 
     form.C003LOGD = request.META['REMOTE_ADDR'] 
     form.C003LOGF = request.META['USERDOMAIN'] 
     form.save() 
     form = T031003Form() 
    else: 
     return HttpResponseRedirect('/erro/') 
return render_to_response('T031003Form_edit.html', {'form': form,}, context_instance=RequestContext(request)) 

Любая помощь будет очень признательна!

ответ

0

Ну, благодаря помощи со стороны близкого друга, я мог бы сделать трюк с использованием FormSets. Вот вид:

def t031002form_edit(request, id_auto): 
j = get_object_or_404(T031002, pk=id_auto) 

T031003FormSet = modelformset_factory(T031002, can_delete=True, max_num=1) 

if request.method == 'POST': 
    form = T031002FormSet(request.POST or None, request.FILES or None, queryset=T031002.objects.filter(pk=id_auto)) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     form.C003LOGA = request.user 
     form.C003LOGB = datetime.date.today() 
     form.C003LOGD = request.META['REMOTE_ADDR'] 
     form.C003LOGF = request.META['USERDOMAIN'] 
     for reform in instance: 
      reform.save() 
    else: 
     return HttpResponseRedirect('/erro/') 
else: 
    form = T031002FormSet(queryset=T031002.objects.filter(pk=id_auto)) 
return render_to_response(('T031002Form_edit.html'), {'form': form,}, context_instance=RequestContext(request)) 

Итак, с помощью форм, вы можете работать красиво и без проблем. Надеюсь, это поможет другим с таким же вопросом.

+0

Просто мелочь дополнительно: это «id_auto» - это значение, которое вы пройдете по URL-адресу. В вашем urls.py вы получите 'url (r '^ t031002form_edit/(? P \ d +) /', 'Mod031.views.t031002form_edit')' и в шаблоне вы передадите что-то вроде:/t031002form_edit/1/Это приведет вас к записи в БД, где «id» равно 1 (а идентификатор в этом случае - AutoField). –

0

Если модель имеет AutoField - первичный ключ Автоинкрементный - то, что автоинкрементное значение будет рассчитываться и сохранено как атрибут на вашем объекте первый раз, когда вы называете сохранить():

>>> b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.') 
>>> b2.id  # Returns None, because b doesn't have an ID yet. 
>>> b2.save() 
>>> b2.id  # Returns the ID of your new object. 

Невозможно сказать, какое значение будет иметь идентификатор, прежде чем вы вызовете save(), потому что это значение рассчитывается вашей базой данных, а не Django.

исх: https://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

+0

Спасибо за объяснение! Итак, если у меня уже есть несколько записей внутри этой базы данных, и у меня нет «id» из-за того, что AutoField, который я использовал в моей модели, переопределил его, как я могу отредактировать одну точную запись? Какие параметры следует передать методу? –

+0

Извините, я не получил вашу точку в методе и записи редактирования? –

+0

Если я не укажу «id» в качестве параметра, чтобы определить, какую запись внутри базы данных я хочу изменить, 'def t031003form_edit (request, id = None):' то что мне передать? Например, внутри «def», если я устанавливаю pk = 1 вместо pk = id, он всегда выбирает первую запись таблицы для изменения через представление. Но если я хочу изменить любую запись через представление, как я могу определить, какую запись я изменяю? Благодарим вас за терпение, это просто для меня, чтобы понять, как это работает. –

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