我一直在使用 django Rest 框架开发的电子商务平台。url 的数量日益增加,并且有许多设计结构相似的 API 端点 (url)。
例如:
/api/user/<str:user_uniq_id>/
/api/user/sigin/
/api/user/registration/
/api/user/invitation/edit/
/api/user/invitation/<str:uniq_id>/
有时,当我点击任何网址时,另一个网址就会被触发。假设我击中了/api/user/<str:user_uniq_id>但/api/user/signin/被叫了。
我该如何解决这个问题?
django url 有排序优先级吗?
这是我在 Stackoverflow 上的第一个问题!
我是 Django 新手,正在学习一些教程。
我试图了解是否有一种方法可以从不同的视图类(如 APIView 和viewsets.ModelViewSet)设置 API 的路由(如果我不使用好的措辞,请告诉我)
在我的观点中:
from rest_framework import viewsets
from post.models import UniquePost
from .serializers import UniquePostSerializers
from rest_framework.views import APIView
class UniquePostViewSet(viewsets.ModelViewSet):
serializer_class = UniquePostSerializers
queryset = UniquePost.objects.all()
class FileUploadView(APIView):
some code here but no queryset nor serialized data...and no model
Run Code Online (Sandbox Code Playgroud)
在网址中我有:
from post.api.views import UniquePostViewSet
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from post.api.views import FileUploadView
router = DefaultRouter()
router.register('UniquePost', UniquePostViewSet, base_name='uniquepostitem')
router.register('demo', FileUploadView, base_name='file-upload-demo')
urlpatterns = router.urls
Run Code Online (Sandbox Code Playgroud)
但似乎我可以通过这种方式注册FileUploadView。因为我没有要渲染的查询集。 …
假设我们正在使用 django 实现一个简单的博客,并且可以通过 等 URL 访问博客文章/posts/1/。/posts/2/
当我们在 urlpatterns 数组中定义路径变量时,使用
path('post/<int:pk>/', ..., ...)和 之间的主要区别是什么path('post/<pk>/', ..., ...)?
这只是好的做法吗?有实际好处吗?
从 Django 1.11 迁移时,我在 Django 3.1.5 中收到此警告
?: (2_0.W001) Your URL pattern 'employee/attendanceactivity/attendance/(?P<attendance_id>\d+)/' [name='employee-attendanceactivity-detail'] has a route that contains '(?P<', begins with a '^', or ends with a '$'. This was likely an oversight when migrating to django.urls.path().
Run Code Online (Sandbox Code Playgroud)
这是 url.py 的声明
path('employee/attendanceactivity/attendance/(?P<attendance_id>\d+)/',
views.employee_attendanceactivity_detail, name = 'employee-attendanceactivity-detail'),
Run Code Online (Sandbox Code Playgroud)
我应该如何解决这个警告?谢谢
我需要在基于类的视图中检索 url 中写入的 pk 值:
path('<int:pk>/data/', views.DataView.as_view(), name='data'),
Run Code Online (Sandbox Code Playgroud)
get然而,我到处看到的是在or等方法的定义中检索到的 pk post。
我想要的是能够使用它来定义我的类变量,因为我需要在类中的每个方法中从这个 pk 中获取相同的值,如下所示:
class DataView(ContextMixin, UpdateView):
pk = get_pk_from_url
...
value = ...
def get(self, request, *args, **kwargs):
value = self.value
# Do something with value
def post(self, request, *args, **kwargs):
value = self.value
# Do something with value
Run Code Online (Sandbox Code Playgroud)
我在写这个问题时得到了一个想法,那就是定义一个可以完成我需要的方法,然后在我的其他方法中调用这个方法。
class DataView(ContextMixin, UpdateView):
def get_value(self):
self.pk = self.kwargs['script_id']
...
self.value = ...
def get(self, request, *args, **kwargs):
self.get_value()
value = self.value
# Do something with value
def …Run Code Online (Sandbox Code Playgroud) python django django-urls django-views django-class-based-views
我的urls.py中的代码用于我的通用视图;
infodict = {
'queryset': Post.objects.all(),
'date_field': 'date',
'template_name': 'index.html',
'template_object_name': 'latest_post_list',
}
urlpatterns += patterns('django.views.generic.date_based',
(r'^gindex/$', 'archive_index', infodict),
)
Run Code Online (Sandbox Code Playgroud)
因此,转到地址/ gindex /将使用带有'index.html'模板的通用视图.
但由于我在这个urlpattern中会有更多通用视图,我应该如何使用相同的infodict提供不同的模板名称?我不想使用大量的infodicts,我不能使用默认的模板名称.
请注意,这也适用于infodict中的模板对象名称.
谢谢你的帮助!
编辑:这是我关于stackoverflow的第一个问题之一,我对这些彻底的答案感到惊讶!我更喜欢使用我不知道的dict构造函数.我发现使用python文档有点困难,因为我找不到我正在寻找的东西!
再次感谢所有的答案和不同的方法.
我知道我可以通过URL模式传递对象值,并在视图函数中使用它们.例如:
(r'^edit/(?P<id>\w+)/', edit_entry),
Run Code Online (Sandbox Code Playgroud)
可以像:
def edit_entry(request, id):
if request.method == 'POST':
a=Entry.objects.get(pk=id)
form = EntryForm(request.POST, instance=a)
if form.is_valid():
form.save()
return HttpResponseRedirect('/contact/display/%s/' % id)
else:
a=Entry.objects.get(pk=id)
form = EntryForm(instance=a)
return render_to_response('edit_contact.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
但是如何从URL中的模型字段("id"除外)传递值?例如,我有一个抽象的基本模型,其字段为"job_number",由子模型"OrderForm"和"SpecReport"共享.我想点击订单上的"job_number",并为同一个工作号码调用规格报告.我可以创建一个
href="/../specifications/{{ record.job_number }}
Run Code Online (Sandbox Code Playgroud)
将信息传递给url,但我已经知道这个正则表达式语法不正确:
(r'^specifications/(?P<**job_number**>\w+)/', display_specs),
Run Code Online (Sandbox Code Playgroud)
我也不能像在id中那样捕获视图中的job_number:
def display_specs(request, job_number):
records = SpecReport.objects.filter(pk=job_number)
tpl = 'display.html'
return render_to_response(tpl, {'records': records })
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法,还是比我认为的更复杂?
修改后的代码如下:
(r'^specdisplay/?agencyID=12/', display_specs),
Run Code Online (Sandbox Code Playgroud)
和:
def display_specs(request, agencyID):
agencyID= request.GET.get('agencyID')
records = ProductionSpecs.objects.filter(pk=id)
tpl = 'display_specs.html'
return render_to_response(tpl, {'records': records })
Run Code Online (Sandbox Code Playgroud)
不知道如何过滤.pk不再适用.
我有一个Django站点,它使用项目名称来创建查看器友好的URL.例如:
/item/DeluxeWidget/
Run Code Online (Sandbox Code Playgroud)
我有一个项目名称中有&符号:
/item/Red & Blue Widget/
Run Code Online (Sandbox Code Playgroud)
&符号抛出了一些东西.如果我使用{{widget.name | fix_ampersands}},&符号将被转义,&但仍未在网址格式中获取:
url(r"^widget/(?P<name>[0-9a-zA-Z&,. -]+)/$", 'site.views.widget' ),
Run Code Online (Sandbox Code Playgroud)
在视图中我使用捕获的名称来做
Widget.objects.get(name=name)
Run Code Online (Sandbox Code Playgroud)
在URL中处理&符号的转义,模式或过滤器的正确组合是什么?我也期望在其中遇到带撇号的名字.有什么办法可以处理吗?
在Django中,是否有可能有两个不同的url模式文件,这两个文件都没有被调用urls.py?或者Django是否依赖于每个Django app只有一组url模式,并且必须调用它urls.py?
我正在使用Django CMS,我希望将应用程序拆分为两个apphooks和两个菜单.所以,我已经试过分裂urls.py成pub_urls.py和train_urls.py,但我似乎通过这样做,有破事,尽管cms_app.py命名正确的URL -例如:
from cms.app_base import CMSApp
from cms.apphook_pool import apphook_pool
from django.utils.translation import ugettext_lazy as _
from resources.menu import TrainingMenu, PublicationMenu
class PublicationApp(CMSApp):
name = _("Publication App") # give your app a name, this is required
urls = ["resources.pub_urls"] # link your app to url configuration(s)
menus = [PublicationMenu]
class TrainingApp(CMSApp):
name = _("Training App") # give your app a name, this is required
urls …Run Code Online (Sandbox Code Playgroud) 我有一个带有一个可选参数的网址格式:
# urls.py :
url(r'^(page/(?P<page>\w+))?$', MyIndexView.as_view(), name='index'),
Run Code Online (Sandbox Code Playgroud)
分页和其他所有方法都可以正常工作,直到我在模板中创建指向特定页面的网址为止:
# templates/mysite.html
{% url 'index' 54 %}
Run Code Online (Sandbox Code Playgroud)
然后我得到一个错误:
Reverse for 'index' with arguments '(54,)' and keyword arguments '{}' not found. 1 pattern(s) tried: [u'(page/(?P<page>\\w+))?$']
Run Code Online (Sandbox Code Playgroud)
没有该参数,它将起作用:
{% url 'index' %}
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
{% url 'index' page=54 %}
Run Code Online (Sandbox Code Playgroud)
并得到类似的错误。