Django 异常值:必须使用对象主键或slug调用通用详细视图TransactionDetailView

Django 异常值:必须使用对象主键或slug调用通用详细视图TransactionDetailView,django,uuid,Django,Uuid,当我试图从我的事务列表页面访问事务详细信息页面时,会出现此错误。我使用UUID(primary=true)作为事务详细信息页面的主键 会员资格/型号.py class Transaction(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_transaction") order_id = models.Cha

当我试图从我的事务列表页面访问事务详细信息页面时,会出现此错误。我使用UUID(primary=true)作为事务详细信息页面的主键

会员资格/型号.py

class Transaction(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_transaction")
    order_id = models.CharField(max_length=36, blank=True, unique=True, default=uuid.uuid4, primary_key=True, editable=False)
    membership = models.ForeignKey(Membership, on_delete=models.SET_NULL, null=True, blank=True)
    amount = models.DecimalField(max_digits=100, decimal_places=2)
    success = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)


    def __str__(self):
        return self.order_id

    class Meta:
        ordering = ['-timestamp']
...removed imports


urlpatterns = [

    #Generic
    url(r'^django-admin/', admin.site.urls),
    url(r'^admin/', include(wagtailadmin_urls)),
    url(r'^documents/', include(wagtaildocs_urls)),
    url(r'^search/$', search_views.search, name='search'),

    #Authentication
    url(r'^accounts/', include('allauth.urls')),

    #Product
    url(r'^portal/', include(('portal.urls', 'portal'), namespace='portal')),

    #Payment
    url(r'^checkout/', include(('checkout.urls', 'checkout'), namespace='checkout')),

    #Membership
    url(r'^membership/', include(('memberships.urls', 'memberships'), namespace='memberships')),

    #Rating
    url(r'^ratings/', include('star_ratings.urls', namespace='ratings')),

    #Users
    url(r'^users/$', UserListView.as_view(), name='users_list'),
    url(r'^profile/$', userPage, name='userPage'),
    url(r'^users/~redirect/$', UserRedirectView.as_view(), name='redirect'),
    url(r'^users/(?P<username>[\w.@+-]+)/$', UserDetailView.as_view(), name='detail'),
    url(r'^users/(?P<username>[\w.@+-]+)/summary/$', SummaryDetailView.as_view(), name='summary'),
    url(r'^users/~update/$', UserUpdateView.as_view(), name='update'),
    url(r'^users/redirectprofile/$', RedirectProfileView.as_view(), name='redirectprofile'),
    # For anything not caught by a more specific rule above, hand over to
    # Wagtail's page serving mechanism. This should be the last pattern in
    # the list:
    url(r'', include(wagtail_urls)),

    # Alternatively, if you want Wagtail pages to be served from a subpath
    # of your site, rather than the site root:
    #    url(r'^pages/', include(wagtail_urls)),
]




if settings.DEBUG:
    from django.conf.urls.static import static
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    # Serve static and media files from development server
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
from django.urls import path

from .views import (
    MembershipSelectView,
    PaymentView,
    success,
    updateTransactionRecords,
    user_subscriptions_view,
    cancelSubscription,
    TransactionDetailView,
    TransactionListView,
    SubscriptionDetailView,
    SubscriptionListView,
    adminPanel,
    permission_denied
    )

app_name = 'memberships'

urlpatterns = [
    path('', MembershipSelectView.as_view(), name='select'),
    path('payment/', PaymentView, name='payment'),
    path('success/', success, name='purchase_success'),
    path('update-transactions/<subscription_id>/', updateTransactionRecords, name='update-transactions'),
    path('subscription/', user_subscriptions_view, name='user_subscription'),
    path('cancel/', cancelSubscription, name='cancel'),

    #TODO MAKE SURE ONLY SUPERUSERS CAN VIEW THESE PAGES
    path('transactions/', TransactionListView.as_view(), name='transaction_list'),
    path('transaction/<uuid:order_id>/', TransactionDetailView.as_view(), name='transaction_detail'),
    path('subscriptions/', SubscriptionListView.as_view(), name='subscription_list'),
    path('subscription/<slug:id>/', SubscriptionDetailView.as_view(), name='subscription_detail'),
    path('admin/', adminPanel, name='admin_panel'),
    path('permission_denied/', permission_denied, name='permission_denied')
]
class TransactionDetailView(DetailView):
    model = Transaction
    slug_field = 'order_id'
url.py

class Transaction(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="user_transaction")
    order_id = models.CharField(max_length=36, blank=True, unique=True, default=uuid.uuid4, primary_key=True, editable=False)
    membership = models.ForeignKey(Membership, on_delete=models.SET_NULL, null=True, blank=True)
    amount = models.DecimalField(max_digits=100, decimal_places=2)
    success = models.BooleanField(default=True)
    timestamp = models.DateTimeField(auto_now_add=True, auto_now=False)


    def __str__(self):
        return self.order_id

    class Meta:
        ordering = ['-timestamp']
...removed imports


urlpatterns = [

    #Generic
    url(r'^django-admin/', admin.site.urls),
    url(r'^admin/', include(wagtailadmin_urls)),
    url(r'^documents/', include(wagtaildocs_urls)),
    url(r'^search/$', search_views.search, name='search'),

    #Authentication
    url(r'^accounts/', include('allauth.urls')),

    #Product
    url(r'^portal/', include(('portal.urls', 'portal'), namespace='portal')),

    #Payment
    url(r'^checkout/', include(('checkout.urls', 'checkout'), namespace='checkout')),

    #Membership
    url(r'^membership/', include(('memberships.urls', 'memberships'), namespace='memberships')),

    #Rating
    url(r'^ratings/', include('star_ratings.urls', namespace='ratings')),

    #Users
    url(r'^users/$', UserListView.as_view(), name='users_list'),
    url(r'^profile/$', userPage, name='userPage'),
    url(r'^users/~redirect/$', UserRedirectView.as_view(), name='redirect'),
    url(r'^users/(?P<username>[\w.@+-]+)/$', UserDetailView.as_view(), name='detail'),
    url(r'^users/(?P<username>[\w.@+-]+)/summary/$', SummaryDetailView.as_view(), name='summary'),
    url(r'^users/~update/$', UserUpdateView.as_view(), name='update'),
    url(r'^users/redirectprofile/$', RedirectProfileView.as_view(), name='redirectprofile'),
    # For anything not caught by a more specific rule above, hand over to
    # Wagtail's page serving mechanism. This should be the last pattern in
    # the list:
    url(r'', include(wagtail_urls)),

    # Alternatively, if you want Wagtail pages to be served from a subpath
    # of your site, rather than the site root:
    #    url(r'^pages/', include(wagtail_urls)),
]




if settings.DEBUG:
    from django.conf.urls.static import static
    from django.contrib.staticfiles.urls import staticfiles_urlpatterns

    # Serve static and media files from development server
    urlpatterns += staticfiles_urlpatterns()
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
from django.urls import path

from .views import (
    MembershipSelectView,
    PaymentView,
    success,
    updateTransactionRecords,
    user_subscriptions_view,
    cancelSubscription,
    TransactionDetailView,
    TransactionListView,
    SubscriptionDetailView,
    SubscriptionListView,
    adminPanel,
    permission_denied
    )

app_name = 'memberships'

urlpatterns = [
    path('', MembershipSelectView.as_view(), name='select'),
    path('payment/', PaymentView, name='payment'),
    path('success/', success, name='purchase_success'),
    path('update-transactions/<subscription_id>/', updateTransactionRecords, name='update-transactions'),
    path('subscription/', user_subscriptions_view, name='user_subscription'),
    path('cancel/', cancelSubscription, name='cancel'),

    #TODO MAKE SURE ONLY SUPERUSERS CAN VIEW THESE PAGES
    path('transactions/', TransactionListView.as_view(), name='transaction_list'),
    path('transaction/<uuid:order_id>/', TransactionDetailView.as_view(), name='transaction_detail'),
    path('subscriptions/', SubscriptionListView.as_view(), name='subscription_list'),
    path('subscription/<slug:id>/', SubscriptionDetailView.as_view(), name='subscription_detail'),
    path('admin/', adminPanel, name='admin_panel'),
    path('permission_denied/', permission_denied, name='permission_denied')
]
class TransactionDetailView(DetailView):
    model = Transaction
    slug_field = 'order_id'
会员资格/交易列表.html

      {% if object_list %}

        {% for transaction in object_list %}
        <tr class="text-left">
          <td ><strong><a href="{% url 'memberships:transaction_detail' transaction.order_id %}" class="text-dark">{{ transaction.user }}</a></strong></td>
          <td  class="text-dark">{{ transaction.order_id }}</td>
          <td  class="text-dark ">{{ transaction.timestamp }}</td>
          <td  class="text-dark ">{{ transaction.success }}</td>
          <td  class="text-dark">$ {{ transaction.amount }}</td>
        </tr>
        {% endfor %}

        {% else %}
            <p>There were no transactions found.</p>
    {% endif %}
{%if对象\列表%}
{对象_列表%中事务的百分比}

{{transaction.order_id}
{{transaction.timestamp}
{{transaction.success}}
${{transaction.amount}
{%endfor%}
{%else%}
没有找到任何交易记录

{%endif%}

编辑:我添加了我的主URL.py和memberships/url.py。事务页面位于memberships.url下。

您已将视图的
slug\u字段
参数设置为
order\u id
,但您尚未告诉它从何处获取该字段的值;正如错误所说,视图仍然希望URL为其提供
pk
slug

事实上,您的
order\u id
是主键,而不是slug,Django已经有了您主键的别名:
pk
。因此,您应该将该属性替换为
pk\u url\u kwarg

class TransactionDetailView(DetailView):
    model = Transaction
    pk_url_kwarg = 'order_id'

您已将视图的
slug\u字段
参数设置为
order\u id
,但尚未告诉它从何处获取该字段的值;正如错误所说,视图仍然希望URL为其提供
pk
slug

事实上,您的
order\u id
是主键,而不是slug,Django已经有了您主键的别名:
pk
。因此,您应该将该属性替换为
pk\u url\u kwarg

class TransactionDetailView(DetailView):
    model = Transaction
    pk_url_kwarg = 'order_id'

您需要更新视图中的
slug\u url\u kwarg
。例如:

class TransactionDetailView(DetailView):
    model = Transaction
    slug_field = 'order_id'
    slug_url_kwarg = 'order_id'
    ...
因为基于,slug值是通过视图的属性
slug\u url\u kwarg
从kwargs中获取的

另外,请更新url路径

网址:
path('transaction/',TransactionDetailView.as_view(),name='transaction_detail'),

您需要更新视图中的
slug\u url\u kwarg
。例如:

class TransactionDetailView(DetailView):
    model = Transaction
    slug_field = 'order_id'
    slug_url_kwarg = 'order_id'
    ...
因为基于,slug值是通过视图的属性
slug\u url\u kwarg
从kwargs中获取的

另外,请更新url路径

网址:
path('transaction/',TransactionDetailView.as_view(),name='transaction_detail'),

现在我得到了这个错误,异常值:找不到“transaction\u detail”的反向事务_detail'不是有效的视图函数或模式名称。@DominicM。请参阅我答案中的url部分。您可以分享您的主
url.py
(位于
settings.py
)吗?添加了会员资格/url.py和url.py。交易视图和模型在memberships应用程序下。哈哈,我找到了它,不确定我怎么没看到它。我有{{url'checkout:transaction\u detail'transactions.order\u id}。结帐需要更改为会员身份。谢谢你的帮助!现在我得到了这个错误,异常值:“未找到事务详细信息”的反向事务_detail'不是有效的视图函数或模式名称。@DominicM。请参阅我答案中的url部分。您可以分享您的主
url.py
(位于
settings.py
)吗?添加了会员资格/url.py和url.py。交易视图和模型在memberships应用程序下。哈哈,我找到了它,不确定我怎么没看到它。我有{{url'checkout:transaction\u detail'transactions.order\u id}。结帐需要更改为会员身份。谢谢你的帮助!