2015-07-22 10 views
3

У меня возникли проблемы с созданием UpdateView Class.I удалось сделать createView и UpdateView без добавления какой-либо формы перед добавлением imageField. Но теперь у меня есть imageField, который создает проблему. К счастью, я могу сделать createView и его работу отлично.Django UpdateView с атрибутом ImageField

Ниже мой код CreateView

class CreatePostView(FormView): 
    form_class = PostForm 
    template_name = 'edit_post.html' 

    def get_success_url(self): 
     return reverse('post-list') 
    def form_valid(self, form): 
     form.save(commit=True) 
     # messages.success(self.request, 'File uploaded!') 
     return super(CreatePostView, self).form_valid(form) 
    def get_context_data(self, **kwargs): 
     context = super(CreatePostView, self).get_context_data(**kwargs) 
     context['action'] = reverse('post-new') 
     return context 

Однако я пытался сделать UpdateView (ViewForm). Ниже мой код:

class UpdatePostView(SingleObjectMixin,FormView): 
model = Post 
form_class = PostForm 
tempate_name = 'edit_post.html' 

# fields = ['title', 'description','content','published','upvote','downvote','image','thumbImage'] 

def get_success_url(self): 
    return reverse('post-list') 
def form_valid(self, form): 
    form.save(commit=True) 
    # messages.success(self.request, 'File uploaded!') 
    return super(UpdatePostView, self).form_valid(form) 

def get_context_data(self, **kwargs): 
    context = super(UpdatePostView, self).get_context_data(**kwargs) 
    context['action'] = reverse('post-edit', 
           kwargs={'pk': self.get_object().id}) 
    return context 

Когда я пытаюсь запустить updateView, его дает мне следующую ошибку:

AttributeError at /posts/edit/23/

'UpdatePostView' object has no attribute 'get_object'

Request Method: GET Request URL: http://localhost:8000/posts/edit/23/ Django Version: 1.8.2 Exception Type: AttributeError Exception Value:

'UpdatePostView' object has no attribute 'get_object'

Exception Location: /home/PostFunctions/mysite/post/views.py in get_context_data, line 72 Python Executable: /usr/bin/python Python Version: 2.7.6

Ниже мой url.py:

#ex : /posts/edit/3/ 

url(r'^edit/(?P<pk>\d+)/$', post.views.UpdatePostView.as_view(), 
    name='post-edit',), 
+0

Где был установлен 'get_object()'? – Matt

+0

не могли бы вы помочь мне разобраться в этом? – user3487775

+0

Ну, что stacktrace говорит вам, что ошибка возникает, потому что вы вызвали метод ('get_object'), который нигде не определен. То есть, если вы не опубликовали весь свой код? – Matt

ответ

2

У меня есть формы для обновления модели с помощью ImageField. Я действительно расширяю ModelForm для своей модели (для меня это PostForm).

Но мой CustomUpdateView расширяет UpdateView, из общего представления django.

from django.views.generic.edit import UpdateView 
from django.shortcuts import get_object_or_404 


class CustomUpdateView(UpdateView): 
    template_name = 'some_template.html' 
    form_class = CustomModelForm 
    success_url = '/some/url' 

    def get_object(self): #and you have to override a get_object method 
     return get_object_or_404(YourModel, id=self.request.GET.get('pk')) 

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

get_object_or_404() работает как функция get() на модели, поэтому замените идентификатор на имя своего поля field_id.

Надеюсь, это поможет

+0

Я попытался после вашего примера Его дает ошибку: Страница не найдена (404) Запрос Метод: \t GET Request URL: \t HTTP: // локальный: 8000/сообщений/редактировать/22/ Воспитанный: \t post.views.UpdatePostView Нет сообщений, соответствующих указанному запросу. – user3487775

+0

Однако, когда я жестко задаю значение, его работа. Его просто, что он не может получить значение из url (pk). get_object_or_404 (Post, pk = '22 '): его рабочий штраф , поэтому его нужно выяснить, как получить значение из URL-адреса – user3487775

+0

Вы вызвали CustomUpdateView.as_view(), не указав свой URL-адрес? – Bestasttung