2014-06-02 8 views
1

Я пытаюсь разрешить пользователю обновлять логическую переменную модели, но у меня, похоже, возникают проблемы с сохранением изменения в db, а затем визуализация изменения в шаблоне. модель - «Pic», а логическая переменная - «Хорошо».Проблемы с Django POST во взглядах

В шаблоне (пространство имен 'single_picture'):

<form action="" method="POST"> 
    {% csrf_token %} 
    {% if Pic.Good %} 
    <input type="submit" name="choice" id="{{ Pic.id }}" value="False" /> 
    {% else %} 
    <input type="submit" name="choice" id="{{ Pic.id }}" value="True" /> 
    {% endif %} 
</form> 

В URLs из приложения:

url(r'^(?P<Pic_id>\d+)/$', views.single_picture, name='single_picture'), 

и views.py:

def single_picture(request, Pic_id): 
# 'detail' in tutorial 
if request.method == 'GET': 
    pic = get_object_or_404(Pic, pk=Pic_id) 
    latest_pictures_list = Pic.objects.all() 
    return render(request, 'pictures/single_picture.html', {'Pic': pic, 'latest_pictures_list': latest_pictures_list}) 
elif request.method == 'POST': 
    pic = get_object_or_404(Pic, pk=Pic_id) 
    latest_pictures_list = Pic.objects.all() 
    try: 
     pic.Good=request.POST['choice'] 
    except (KeyError, Pic.DoesNotExist): 
     return render(request, 'pictures/single_picture.html', {'Pic': pic, 'error_message': 'uhhhh...', 
     }) 
    else: 
     pic.save() 
     return HttpResponseRedirect(reverse('pictures:pic', pic.id)) 

Если я печатаю pic.Good к терминалу в конце инструкции try: я вижу, что он показывает измененный, но pic.save(), похоже, не сохраняет его до е дБ, и я также получаю

ImproperlyConfigured в/фотографий/4/

Прилагаемый URLconf 4 не имеет каких-либо шаблонов в нем

в рендер заявлении. Это, похоже, указывает на то, что отсутствует в URL-адресах проекта или приложения. Как правильно сохранить изменения и внести изменения?

ответ

1

Согласно django documentation on reverse function, вторым параметром является аргумент urlconf.

Аргумент urlconf - это модуль URLconf, содержащий шаблоны url для использования в обратном порядке.

Чтобы поставить параметр для URL-адреса строительства, необходимо использовать арг или kwargs именованные аргументы.

Попробуйте изменить оператор возврата к чему-то вроде этого:

return HttpResponseRedirect(reverse('pictures:pic', args=[pic.id])) 

Я не знаю, о базе данных сохранить проблему, но попробуйте переместить ваш ПИК сохранить звоните ближе к ПОС код обновления для отладки цели:

elif request.method == 'POST': 
    pic = get_object_or_404(Pic, pk=Pic_id) 
    latest_pictures_list = Pic.objects.all() 
    try: 
     pic.Good=request.POST['choice'] 
     pic.save() 
     return HttpResponseRedirect(reverse('pictures:pic', args=[pic.id])) 
    except (KeyError, Pic.DoesNotExist): 
     return render(request, 'pictures/single_picture.html', {'Pic': pic,  'error_message': 'uhhhh...', 
     }) 

Edit 1

Что касается ошибки NoReverseMatch, вы используете url namespaces ('пикт УРЭС: ПИК '). Я не очень хорошо знаком с этим, но я думаю, что функция обратная ищет вид с name = 'pic' внутри конфигурации URL для Фотографии приложение.

Вы уверены, что такой вид существует в вашем конфигурационном файле url?

+0

Это не похоже, чтобы решить одну из моих проблем. Изменения все еще не сохраняются в базе данных, и я получаю NoReverseMatch at/pictures/4/ Обратный для 'pic' с аргументами '(4,)' и аргументами ключевого слова '{}' not found , 0 образец (ы): [] ошибки для обратного вызова(). – mcbrandt13

+0

Не могли бы вы разместить всю конфигурацию своего URL-адреса для приложения? Или, по крайней мере, конфигурацию для 'pictures: pic' url? – dvd

+0

Кажется, вы были правы. Я обновил запрос на возврат: 'return HttpResponseRedirect (reverse ('pictures: single_picture', args = [Pic_id]))' 'single_picture' является именем URL-адреса. Мне также пришлось обновить arg до «Pic_id». – mcbrandt13

-1

не ответ на ваш вопрос, но хороший совет, чтобы заменить это:

<form action="" method="POST"> 
    {% csrf_token %} 
    {% if Pic.Good %} 
    <input type="submit" name="choice" id="{{ Pic.id }}" value="False" /> 
    {% else %} 
    <input type="submit" name="choice" id="{{ Pic.id }}" value="True" /> 
    {% endif %} 
</form> 

с этим:

<form action="" method="POST"> 
    {% csrf_token %} 
    <input type="submit" name="choice" id="{{ Pic.id }}" value={% if Pic.Good %}"True"{% else %} "False" {% endif %} /> 
</form> 
Смежные вопросы