2016-12-23 4 views
1

제출하여 데이터베이스에 항목을 업로드하는 양식을 만들었습니다. 문제는 URL이 이제는 다르기 때문에 f5 키를 누르면 양식이 다시 제출된다는 것입니다.URL 패턴을 사용하는 적절한 방법

나는이 두 URL 패턴

urlpatterns = [ 
      url(r'(?i)^CMS/$', views.CMS, name='CMS'), 

      url(r'^createItem/$', views.createItem, name='createItem') 
] 

을 내보기 내 양식이

def CMS(request):  
    form = itemCreateForm() 

    context = { 
      'form' : form, 
      'message' : 'Content Manage Site' 
    } 
    return render(request, 'CMS.html', context) 

def createItem(request):  
    f = itemCreateForm(request.POST) 

    if f.is_valid(): 
     f.save() 
     pass 

    form = itemCreateForm() 

    context = { 
      'form' : form, 
      'message' : 'ItemCreated!' 
    } 

    return render(request, 'CMS.html', context) 

처럼 보이는 CMS.html

{% if message %} 
    {{ message }} 
{% endif %} 

<div class='newItemFields'> 
    <form action="{% url 'kar:createItem' %}" method="POST"> 
    {% csrf_token %} 
     {{ form.as_p }} 
     <input type="submit"> 
    </form> 
</div> 

class itemCreateForm(ModelForm): 
    class Meta: 
     model = item 
     fields = ['name', 'type', 'price'] 

홈페이지/CMS /에서 시작하여 양식을 작성하고 제출 버튼을 누르면보기 기능 createItem이 실행되어 데이터베이스에 개체가 만들어지고 저장됩니다. 사용자를 홈페이지/CMS/createItem으로 보냅니다. 그리고 이제는 사용자가 f5 키를 누를 때마다 createItem 함수가 다시 실행되고 입력 필드가 비어 있더라도 이전 객체와 동일한 값을 가진 다른 객체를 데이터베이스에 삽입합니다 (내 머리를 감쌀 수 없음).

나는 또한 내가 의심 스럽다고 생각하는 form = itemCreateForm()을 두 번 쓰지 않습니까?

createItem을 실행 한 후 사용자에게 홈페이지/CMS/홈페이지 및 CMS/createItem이 아닌 사용자에게 다시 보내야합니다. 그게 올바른 방법일까요? 아니면 이것을하는 현명한 방법이 있습니다.

+0

이 지금 정리되어 템플릿

<div class='newItemFields'> <form action=method="POST"> {% csrf_token %} {{ form.as_p }} <input type="submit"> </form> </div> 

메시지 디스플레이 부분에 작은 변화를 필요가 더 이상 필요하지? – e4c5

답변

1

createItem 함수의 끝에서 리디렉션하지 않고 페이지의 HTML을 렌더링합니다. 대신, 당신은 HttpResponseRedirect를 가져오고 그 이름을 통해 URL을 해결하는 데 사용되는 반전해야합니다

return HttpResponseRedirect(reverse('kar:index')) 

할 필요가있다.

확인이 아웃 : https://docs.djangoproject.com/en/1.10/topics/forms/#the-view

+0

시도해 보니 django.core.urlresolvers.NoReverseMatch : 인자 '()'및 '{}'이 (가)없는 'index'에 대해 역순으로 나타납니다. 1 패턴 시도 : [ 'Homepage/(? i)^$'] – vandelay

1

는 내가 뭘하려는 createItem를 실행 한 후, 그것은 홈페이지/CMS/아니라 홈페이지/CMS/createItem로 다시 사용자를 보내야합니다. 그 그것을 할 적절한 방법이 될 것이라고? 아니면 이것을하는 현명한 방법이 있습니다.

실제로 그렇게하기에 적절하고 현명한 방법이 될 것입니다. 하나의보기가 GET과 POST를 모두 처리 한 다음 성공적인 양식 제출 후에 리디렉션하게하십시오. 이렇게하면 사용자는 새로 고침만으로 양식을 다시 제출할 수 없습니다. 그리고 코드 반복에 대한 우려를 해결합니다. 양식이 유효하지 않은 경우

urlpatterns = [ 
    url(r'(?i)^$', views.index, name='index'), 
    url(r'^createItem/$', views.createItem, name='createItem') 
] 

그런 다음 코드는 이제 짧은 것을 귀하의 의견

def createItem(request):  
    if request.method == 'POST': 
     f = itemCreateForm(request.POST) 

     if f.is_valid(): 
      f.save() 
      return HttpResponseRedirect('/homepage/CMS/') 
    else : 
     form = itemCreateForm() 

     context = { 
       'form' : form, 
       'message' : 'Content Manage Site' 
     } 
    return render(request, 'CMS.html', context) 

주를 결합하여, 사용자에게 적절한 피드백을 제공합니다. 그리고 for를 두 번 새로 고칠 수는 없습니다. 우리는

+0

끔찍한 죄송합니다. 내 URL 패턴에 잘못된 URL을 썼습니다. 인덱스가 있어야하지만 내 CMS가 아니어야합니다. 그래도이게 뭐가 바뀌니? – vandelay

+0

걱정할 필요가 없습니다. 그것은 큰 변화를 일으키지 않습니다. YOU는 언제든지 urls.py를 변경할 수 있으며 '역방향'기능 (URL에 이름을 지정한 후)을 사용하여 리디렉션이 중단되지 않도록 할 수 있습니다. – e4c5

관련 문제