Django NoReverseMatch Reverse для DetailView

Мое приложение выдает ошибку, когда я перенаправляюсь обратно к подробному представлению в Django 1.5.

NoReverseMatch: реверс для «InventoryPlotDetailView» с аргументами «(3,)» и аргументами ключевого слова «{}» не найден.

Он получает правильное значение 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)

person akthor    schedule 14.10.2013    source источник
comment
Вы пытались использовать имя plot_detail в качестве первого аргумента для реверсирования?   -  person Nathan Jhaveri    schedule 14.10.2013
comment
Еще одна вещь, которую я заметил, это то, что pk является именованным аргументом, поэтому вы можете попробовать передать kwargs, а не args для реверсирования.   -  person Nathan Jhaveri    schedule 14.10.2013
comment
Спасибо за ответ, Натан. Я передал kwargs и изменил аргумент на plot_detail, а также любую их комбинацию, которую я мог легко придумать, и все равно получаю ошибку: реверс для 'plot_detail' с аргументами '()' и аргументами ключевого слова '{'pk': 3}' не найден.   -  person akthor    schedule 15.10.2013
comment
Я только что добавил определение модели для двух рассматриваемых таблиц. Существует отношение «многие к одному» между графиками инвентаризации и данными инвентаризации на случай, если эта информация окажется полезной.   -  person akthor    schedule 15.10.2013
comment
Вы определили пространство имен для своих представлений? Опубликуйте свой полный urls.py   -  person Burhan Khalid    schedule 15.10.2013
comment
Разместил полный urls.py, я не разделял свои взгляды.   -  person akthor    schedule 15.10.2013
comment
Спасибо, Натан и Бурхан, это была комбинация всего вышеперечисленного, если вы, ребята, опубликуете ответы, я отдам вам должное.   -  person akthor    schedule 16.10.2013


Ответы (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})
person akthor    schedule 15.10.2013