2012-05-26 2 views
0

Argh. Привет всем, у меня есть простой MUY Джанго вопрос:Django: как мне редактировать/обновлять модель?

И Argh, я извиняюсь, я читал и читать, и я уверен, это покрыто где-то супер-очевидно, но я не нашел Это!

Как отредактировать/обновить модель с помощью django? Например, значения данных? Не поля модели?

Вот мой код! (! Я использую версию самогона материала)

Вот это URLs:

url(r'^editStory/(?P<id>\d+)$', 
    StoryModelView.as_view(
     context_object_name='form', 
     template_name ='stories/editStory.html', 
     success_template= 'stories/editStorySuccess.html' 
    ), 
    {}, 
    'editStory' 
), 

Здесь вы вид:

def get(self,request,id=None): 
    form = self.getForm(request,id) 
    return self.renderValidations(form) 

def getForm(self, request,id): 
    if id: 
     return self.getModelById(request,id) 
    return StoryForm() 

def getModelById(self,request,id): 
    theStory = get_object_or_404(Story, pk=id) 
    if theStory.user != request.user: 
     raise HttpResponseForbidden() 
    return StoryForm(theStory) 

def renderValidations(self,form): 
    if self.context_object_name: 
     contextName = self.context_object_name 
    else: 
     contextName = 'form' 
    if self.template_name: 
     return render_to_response(self.template_name,{contextName:form}) 
    else : 
     return render_to_response('stories/addStory.html',{contextName:form}) 

def getPostForm(self,request,id): 
    if id: 
     theStory = self.idHelper(request,id) 
     return StoryForm(request.POST,theStory) 
    return StoryForm(request.POST) 

def processForm(self,form,request): 
    theStory = form.save(commit=False) 
    theStory.user = request.user 
    return theStory 

Вот код шаблона:

{% block content %} 
    <h3>Edit story</h3> 
    <form action="" method="post"> 
     {% csrf_token %} 
     {% for field in form %} 
      <div class="fieldWrapper"> 
       {{ field.errors }} 
       {{ field.label_tag }} {{ field }} 
      </div> 
     {% endfor %} 
     <input type="submit" value="Submit"/> 
    </form> 
{% endblock %} 

попробовать, как я мог бы, я либо:

  1. получить ошибку
  2. ничего не получить

я получаю сообщение об ошибке с кодом, как-дисплеем, вызванной этой линией

{% for field in form %} 

и с погрешностью:

Caught AttributeError while rendering: 'Story' object has no attribute 'get' 

или я не получаю ничего - никаких данных вообще - если я изменить мой метод «getModelById» читать:

def getModelById(self,request,id): 
    theStory = get_object_or_404(StoryForm, pk=id) 
    if theStory.user != request.user: 
     raise HttpResponseForbidden() 
    return theStory 

StoryForm является одной из тех вещей «ModelForm», и его модель «история».

SO! Вопрос:

Как исправить этот код, чтобы он работал? Что я сделал не так?

ответ

1

Вы не показываете, на что наследуется ваш класс, но похоже, что вы просто используете стандартное представление одного объекта.Вместо этого вы должны использовать один из editing mixins, который предоставляется для этой цели.

+0

Редактирование mixins - это то, что каждый говорит так, что ура для ответов - хотя я был совершенно неспособен найти учебник «Редактирование микширования для манекена», чтобы вести меня. В конце концов, я создал класс, который расширил View, и перезаписал методы get и post, чтобы внести изменения. Я могу опубликовать код позже и спросить «как мне преобразовать это в mixin». – bharal

+0

Попробуйте еще раз взглянуть на общие представления docs. Они просто (за последние пару дней) полностью обновили его, поэтому его гораздо проще в использовании, поэтому теперь это может быть полезно. –

1

Не зная, что ваша модель выглядит, что вы ищете что-то вдоль линий

s = Story.objects.get(some criteria) 
s.user = <some user> 
s.save() 

?

Извините, я нахожу ваш вопрос немного расплывчатым.

После перечитывая, одна вещь, выскочили на меня:

Вы не можете сделать запрос (получить, фильтр или любое изменение на них) на model-- вы должны сделать это на объект менеджера , как объекты.

Так, как указано выше, в вашем случае Story.objects.get_object_or_404 должен решить вашу ошибку.