2013-10-14 3 views
0

Мое приложение вызывает ошибку при перенаправлении обратно в подробный вид Django 1.5.Django NoReverseMatch Reverse for DetailView

NoReverseMatch: Reverse for 'InventoryPlotDetailView' with arguments '(3,)' and keyword arguments '{}' not found.

Это становится правильный forestinventoryplot_id, но мне кажется, что взгляд деталь не знает, как обращаться с аргументом. Если я получаю доступ к подробному представлению вручную (http://[server]/geoapp/inventory_plot/detail/3/), он работает так, как ожидалось. Ниже приведены соответствующие кусочки, любые советы?

Views.py:

class InventoryPlotDetailView(DetailView): 
    queryset = ForestInventoryPlot.objects.all() 
    template_name = 'geoapp/forestinventoryplot_detail.html' 
    context_object_name = 'plot_detail' 

def InventoryDataAdd(request, forestinventoryplot_id=1): 
    if request.method == 'POST': 
     form = InventoryDataForm(request.POST) 
     if form.is_valid(): 
      new_data = form.save()   
      return HttpResponseRedirect(reverse('geoapp:InventoryPlotDetailView', args=(new_data.forestinventoryplot_id,))) 
    else: 
     initial_data = {'forestinventoryplot' : forestinventoryplot_id} 
     form = InventoryDataForm(initial=initial_data)  
     return render(request, 'geoapp/forestinventorydata_add.html', {'form': form}) 

urls.py:

urlpatterns = patterns('', 
    url(r'^index$', views.Index), 
    url(r'^$', views.Index), 
    url(r'^inventory_plot/add/$', views.InventoryPlotAdd, name='inventory_plot_add'), 
    url(r'^inventory_plot/edit/(?P<forestinventoryplot_id>\d+)$', views.InventoryPlotEdit, name='inventory_plot_edit'), 
    url(r'^inventory_plot/delete/(?P<pk>\d+)$', views.InventoryPlotDelete, name='inventory_plot_delete'), 
    url(r'^map/$', views.map_page), 
    url(r'^map2/$', views.map2_page), 
    url(r'^inventory_plot/$', views.InventoryPlotListView.as_view(), name='inventory_plot_list'), 
    url(r'^inventory_plot/detail/(?P<pk>\d+)/$', views.InventoryPlotDetailView.as_view(), name='plot_detail'), 
    url(r'^inventory_data/add/$', views.InventoryDataAdd, name='inventory_data_add'), 
    url(r'^inventory_plot/(?P<forestinventoryplot_id>\d+)/add_data/$', views.InventoryDataAdd, name='inventory_data_add'), 
    url(r'^accounts/login/$', 'django.contrib.auth.views.login'), 
    url(r'^accounts/logout/$', views.logout_view), 
    url(r'^home/$', views.Home, name = 'home'), 
    url(r'^inventory_data/add/(?P<forestinventoryplot_id>\d+)/$', views.InventoryDataAdd, name='inventory_data_addition'), 
) 

Models.py:

class ForestInventoryPlot(models.Model): 
    forestinventoryplot_id = models.AutoField(primary_key=True) 
    plot_area_ft2 = models.DecimalField(null=True, blank=True, max_digits=5, decimal_places=1) 
    plot_radius_ft = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True) 
    plot_length_x_ft = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True) 
    plot_length_y_ft = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True) 
    plot_geometry = models.CharField(max_length=30, null=True, blank=True) 
    geometry = models.PointField(srid=4326, null=True, blank=True) 
    elevation = models.IntegerField(null=True, blank=True) 
    position_description = models.CharField(max_length=255, null=True, blank=True) 
    plot_create_date = models.DateField(null=True, blank=True) 
    created_by = models.CharField(max_length = 100) 
    objects = models.GeoManager() 
    class Meta: 
      db_table = 'forest_inventory_plot' 
      ordering = ["forestinventoryplot_id"] 
    def __unicode__(self): 
     return unicode(self.forestinventoryplot_id) 

class ForestInventoryData(models.Model): 
    forestinventorydata_id = models.AutoField(primary_key=True) 
    forestinventoryplot = models.ForeignKey('ForestInventoryPlot', null=True, blank=True) 
    tree = models.ForeignKey('Tree', null=True, blank=True) 
    collection_date = models.DateField(null=True, blank=True) 
    species = models.CharField(max_length=30, null=True, blank=True) 
    dbh_in = models.DecimalField(max_digits=4, decimal_places=1, blank=True, null=True) 
    height_ft = models.DecimalField(max_digits=4, decimal_places=2, blank=True, null=True) 
    class Meta: 
     db_table = 'forest_inventory_data' 
     ordering = ["forestinventorydata_id"] 
    def __unicode__(self): 
     return unicode(self.forestinventorydata_id) 
+2

Вы пытались использовать имя "plot_detail" в качестве первого аргумента для обращения вспять? –

+1

Еще одна вещь, которую я заметил, это pk - именованный аргумент, поэтому вам нужно попытаться передать kwargs, а не args, чтобы отменить. –

+0

Спасибо за ответ, Натан. Я передал kwargs и изменил аргумент на plot_detail, а также каждую их комбинацию, о которой я мог легко думать и все еще получать ошибку: Обратный для 'plot_detail' с аргументами '()' и ключевыми словами '{' pk ': 3}' не найдено. – akthor

ответ

1

мнение требует прохождения первичного в качестве kwarg, используя имя записи url.py (plot_detail) и используя добавленное к нему пространство имен ('geoapp: plot_detail'), чтобы все работало.

def InventoryDataAdd(request, forestinventoryplot_id=1): 
     if request.method == 'POST': 
      form = InventoryDataForm(request.POST) 
      if form.is_valid(): 
       new_data = form.save() 
       return HttpResponseRedirect(reverse('geoapp:plot_detail', kwargs={'pk':new_data.forestinventoryplot_id})) 
     else: 
      initial_data = {'forestinventoryplot' : forestinventoryplot_id} 
      form = InventoryDataForm(initial=initial_data) 
     return render(request, 'geoapp/forestinventorydata_add.html', {'form': form})