我的项目配置是这样的。这是realated到联系表。这里我有两种方法:客户从前端只能张贴(即发送消息)和管理员只能检索和列出的联系人。
- 型号. py**
class Contact(models.Model):
full_name = models.CharField(max_length=100)
email = models.EmailField()
phone_no = models.CharField(max_length=10, validators=[validate_phone_no])
message = models.TextField()
created_at = models.DateTimeField(auto_now_add=True, blank=True, null=True)
def __str__(self):
return self.email
- 序列化程序. py**
class ContactSerializer(serializers.ModelSerializer):
class Meta:
model = Contact
fields = [
'full_name',
'email',
'phone_no',
'message',
]
- 浏览次数. py**
class ContactViewset(viewsets.ModelViewSet):
permission_classes = [IsAuthenticated]
queryset = Contact.objects.all()
search_fields = []
ordering_fields = []
ordering = []
http_method_names = ["options", "head", "get"]
serializer_class = ContactSerializer
class CustomerContactViewSet(viewsets.ModelViewSet):
permission_classes = [AllowAny]
queryset = Contact.objects.all()
http_method_names = ['post']
serializer_class = ContactSerializer
- 网址. py**
router.register("contacts-detail", ContactViewset)
router.register("contact-form", CustomerContactViewSet)
我的问题是:为什么DRF会为两个视图生成相同的url,尽管我为它们提供了不同的名称:
'contact-form'----> for posting and
'contact-detail'--------> for listing the contacts
- 两个视图都指向同一型号 *-这是原因吗?
Click Here to see generated api url
查看上次URL是否相同:然后重定向到"联系人表单"。我知道我可以用base_name来分隔这两个表单。
但我想知道生成相同网址背后的机制:
If anyone could explain this? Clearly
1条答案
按热度按时间mqkwyuun1#
问题出在您定义路由器的方式上。请在www.example.com文件中注册调用urls.py。
router.register函数的第一个参数是视图集的基名称。此基名称用于生成视图集的URL模式。如果对多个视图集使用相同的基名称,则路由器将为这两个视图集生成相同的URL模式。
例如,在代码中定义了以下行:
路由器.注册(“联系人详细信息”,联系人视图集)路由器.注册(“联系人表单”,客户联系人视图集)
在这里,您为ContactViewSet使用了基本名称“contacts-detail”,为CustomerContactViewSet使用了基本名称“contact-form”。这将导致生成两种不同的URL模式:
但是,由于两个视图集使用相同的模型(Contact),路由器将为两个视图集生成相同的URL模式集。这就是为什么您在API中看到两个视图集的URL模式相同。
要解决此问题,可以为两个视图集使用不同的基本名称。例如,可以为ContactViewSet使用“contacts”,为CustomerContactViewSet使用“customer-contacts”。这将导致生成以下URL模式: