Отслеживание идентификатора объекта в представлении Django

Мое представление представляет собой представление, основанное на функциях (это устаревшее представление, и из-за использования встроенного набора форм его легче сохранить таким, а не CBV). Моя цель - иметь возможность отображать ModelForm для объекта модели Article.objects.get(user=user).latest("id") и с помощью метода POST обновлять тот же объект, который был визуализирован. Проблема в том, что ModelForm «не помнит» объект, которому он соответствовал. Каким будет правильный способ передать эту информацию об объекте в представление для использования в методе POST?

Ниже представлена ​​упрощенная версия views.py и urls.py.

просмотры.py

from django.contrib.auth.models import User
from django.shortcuts import render_to_response
from django.template import RequestContext
from specify.models import Article
from specify.forms import ArticleForm

def index(request):

    user = User.objects.get(username=request.user.username)

    if request.method == "POST":
        a_form = ArticleForm(request.POST, instance= *???* )
        a_form.save()
    else:
        a = Article.objects.get(user=user).latest("id")
        a_form = ArticleForm(instance=a)

    return render_to_response(
        "specify/index.html",
        {
            "a_form" : a_form,
        }, 
        context_instance=RequestContext(request)
    )

urls.py

from django.conf.urls import patterns, url
from specify import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index')
)

EDIT1: добавлены models.py и forms.py

модели.py

from django.db import models

class Article(models.Model):
    pub_date = models.DateField()
    headline = models.CharField(max_length=200)
    content = models.TextField()

формы.py

from django.forms import ModelForm
from specify.models import Article

class ArticleForm(ModelForm):
    class Meta:
        model = Article
        fields = ['pub_date', 'headline', 'content']

person jazzblue    schedule 09.01.2014    source источник
comment
Непонятно, что вы хотите здесь сделать a_form = ArticleForm(request.POST, instance= *???* )? Вы хотите сохранить его в БД?   -  person Khamidulla    schedule 09.01.2014
comment
Хорошо, я понимаю, вы можете опубликовать здесь свою модель и определение ArticalForm?   -  person Khamidulla    schedule 09.01.2014
comment
@Phoenix: только что добавил models.py и forms.py. Спасибо.   -  person jazzblue    schedule 09.01.2014


Ответы (1)


Сначала вы должны передать идентификатор статьи в шаблон в view.py.

def index(request):

user = User.objects.get(username=request.user.username)

if request.method == "POST":
     #Explained later 
else:
    a = Article.objects.get(user=user).latest("id")
    a_form = ArticleForm(instance=a)
    article_id = a.id   

return render_to_response(
    "specify/index.html",
    {
        "a_form" : a_form,
        "article_id": article_id,
    }, 
    context_instance=RequestContext(request)
)

Во-вторых, в вашем шаблоне внутри вашего html-элемента формы вы должны обрабатывать идентификатор своей статьи.

{% if article_id %}
<input type="hidden" value='{{ article_id }}' id='article_id' name='article_id'/>
{% endif %}

В-третьих, при обработке обновлений вы должны сделать следующее:

if request.method == "POST":            
    article_id = request.POST.get('article_id') # You are getting passed article id
    a = Article.objects.get(pk=article_id)      # You are getting instance by id
    a_form = ArticleForm(request.POST, instance=a)
    a_form.save()

Попробуйте выполнить описанные выше шаги, и если у вас возникнут проблемы, оставьте комментарий.

person Khamidulla    schedule 09.01.2014
comment
Спасибо. Незадолго до того, как я попробую: должен ли в шаблоне article_id быть частью отправляемой формы/набора форм? Или иначе, как это будет отправлено? - person jazzblue; 09.01.2014
comment
он должен быть внутри формы. Он будет отправлен автоматически - person Khamidulla; 09.01.2014