Kleju_0011
Kleju_0011

Reputation: 37

Django NoReverseMatch at /

Everything was perfect in my code, but after when I add (?P<no_of_lines>\d+), to one of mine url, I've receveid error:

NoReverseMatch at /

Reverse for 'day_data_multiadd' with arguments '()' and keyword arguments '{}' not found. 1 pattern(s) tried: ['day_data_multiadd/(?P\d+)/$']

I have no idea whats going. I'm beginner so probably that will be very easy...

views.py :

def get_number_of_lines(request):
if request.method == 'POST':
    generate_form = multiadd_generate_form(request.POST)
    if generate_form.is_valid():
        no_of_lines = generate_form.cleaned_data['no_of_lines']
        return HttpResponseRedirect(reverse('multi_add', kwargs={'no_of_lines': no_of_lines}))
else:
    generate_form = multiadd_generate_form()
    c = RequestContext(request, {'generate_form': generate_form})
    return render_to_response('no_lines.html', c)



def day_data_multiadd(request, no_of_lines):
    no_of_lines = int(no_of_lines)
    CostFormSet = modelformset_factory(Cost, form=data_add_form extra=no_of_lines)
    if request.method == 'POST':
        formset = CostFormSet(request.POST, request.FILES)
        if formset.is_valid():
            formset.save()
    else:
        formset = CostFormSet()
        c = RequestContext(request, {'formset': formset})
    return render_to_response('multi_add.html', c)

forms.py

class data_add_form(forms.ModelForm):
class Meta:
    model = Cost
    fields = ['title', 'value', 'publish', 'category']

class multiadd_generate_form(forms.Form):
    formy = forms.IntegerField(max_value=30, min_value=1)

class BaseLineFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseLineFormSet, self).__init__(*args, **kwargs)
        no_of_forms = len(self)
        for i in range(0, no_of_forms):
        self[i].fields['formy'].label += "-%d" % (i + 1)

urls.py

from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.current_detail, name='current_detail'),
    url(r'^stats$', views.costs_stats, name='costs_stats'),
    url(r'^(?P<year>\d{4})/(?P<month>\d{2})/$', views.month_stats_detail, name='month_stats_detail'),
    url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/$', views.day_stats_detail, name='day_stats_detail'),
    url(r'^(?P<year>\d{4})/$', views.year_stats_detail, name='year_stats_detail'),
    url(r'^day_data_multiadd/(?P<no_of_lines>\d+)/$', views.day_data_multiadd, name='day_data_multiadd'),
    url(r'^no_line$', views.get_number_of_lines, name='get_number_of_lines'),
    url(r'^delete/(?P<id>\d+)/$', views.day_data_delete, name='day_data_delete'),
    url(r'^add$', views.data_add, name='data_add'),
]

Upvotes: 0

Views: 207

Answers (2)

Kleju_0011
Kleju_0011

Reputation: 37

I've found the answer:

views.py

def day_data_multiadd(request, no_of_lines=0):
no_of_lines = int(no_of_lines)
CostFormSet = modelformset_factory(Cost, form=DataAddForm, extra=no_of_lines)

if request.method == 'POST' and 'form' in request.POST:
    formset = CostFormSet(request.POST, request.FILES)
    if formset.is_valid():
        formset.save()
else:
    formset = CostFormSet(queryset=Cost.objects.none())

if request.method == 'POST' and 'no_line' in request.POST:
    generate_form = MultiaddGenerateForm(request.POST)
    if generate_form.is_valid():
        cd = generate_form.cleaned_data
        return HttpResponseRedirect(reverse('core_sm:day_data_multiadd', args=(cd['formy'], )))
else:
    generate_form = MultiaddGenerateForm()

return render(request, 'core_sm/costs/multi_add.html', {'formset': formset,
                                                        'no_of_lines': no_of_lines,
                                                        'generate_form': generate_form})

url.py

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

Upvotes: 0

Fran&#231;ois Constant
Fran&#231;ois Constant

Reputation: 5496

You've called this somewhere:

{% url day_data_multiadd %}

where you should provide the number of lines:

{% url day_data_multiadd number_of_lines %}

If you want to add a default value, so the first example would work, you must add an other url pattern and provide a default value in the view:

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

...
def day_data_multiadd(request, no_of_lines=0):
    ...

Upvotes: 1

Related Questions