我刚刚开始学习Django Rest框架。我想隐藏当我们转到其url时可见的api,以便任何人在输入该url时都看不到任何数据。我只需要一个url来发布数据(例如,从会员表格…名称电子邮件等)。我怎样才能做到这一点。这里的大多数问题只涉及隐藏可浏览的api,他们使用JSONRenderer,但我想完全删除JSON。请告诉我我是否想错了方向。这背后的想法是,我不希望我要求用户提供的信息通过该url对每个人都可见。我试着通过以下方式实现这一点。这是一种很好的方法,还是会把应用程序搞砸,因为我看不到任何错误,post请求正在工作。我使用React作为前端。这是我第一次发布问题。如果您需要任何其他信息,请告知。先谢谢你
我只在第一个if块{if request.method=='GET':}中执行了此操作,我返回了一个字符串而不是serializer.data,现在每当我转到membershipform/时,它只显示“serializer.data”而不是所有对象
视图.py
class CsrfExemptSessionAuthentication(SessionAuthentication):
def enforce_csrf(self, request):
return
@api_view(['GET', 'POST'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_list(request):
if request.method == 'GET':
memberform = Memberform.objects.all()
serializer = MemberformSerializer(memberform, many=True)
return Response("serializer.data")
elif request.method == 'POST':
serializer = MemberformSerializer(data=request.data)
if serializer.is_valid():
instance = serializer.save()
# creating a membershipid
fid = instance.id
strid = str(fid)
temp = '{:>06}'
if len(strid) <= 6:
memstrid = temp.format(strid)
else:
memstrid = strid
memyear = str(instance.created_at.year)
memtype = instance.membership_type[0]
memid = memyear + memtype + memstrid
instance.membership_id = memid
instance.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_detail(request, pk):
try:
memberform = Memberform.objects.get(pk=pk)
except Memberform.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = MemberformSerializer(memberform)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = MemberformSerializer(memberform, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
memberform.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
型号.py
class Memberform(models.Model):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(auto_now_add=True)
membership_id = models.CharField(max_length=13, null=True)
name = models.CharField(max_length=500)
email = models.CharField(max_length=200, unique=True)
alt_email = models.CharField(max_length=1500)
designation = models.CharField(max_length=500)
qualification = models.CharField(max_length=500)
specialization = models.CharField(max_length=500)
institute_university = models.CharField(max_length=1000)
institute_city = models.CharField(max_length=500)
institute_state = models.CharField(max_length=500)
institute_pincode = models.CharField(max_length=1000)
permanent_address = models.CharField(max_length=1000)
permanent_address_city = models.CharField(max_length=1000)
permanent_address_state = models.CharField(max_length=1000)
permanent_address_pincode = models.CharField(max_length=1000)
mobile = models.CharField(max_length=50)
official_phone = models.CharField(max_length=50)
membership_type = models.CharField(max_length=50)
research_interests = models.CharField(max_length=1500)
def __str__(self):
return self.name
此外,我还想创建一个成员id,它遵循年度成员类型和id(pk)的格式(例如:2021B00001),因此我在block的POST方法中实现了它。这是正确的方法还是有其他方法?非常感谢你的帮助。任何建议都会对我很有帮助,因为我还在学习Django,感觉自己只是一个蛮力的人
编辑:这是更新的models.py和views.py
型号.py
class Memberform(models.Model):
id = models.AutoField(primary_key=True)
created_at = models.DateTimeField(default=datetime.datetime.now)
membership_id = models.CharField(max_length=20, null=True)
membership_type = models.CharField(max_length=50)
....rest of the fields
def save(self, *args, **kwargs):
strid = str(self.id)
if len(strid) <= 6:
memstrid = '{:>06}'.format(strid)
else:
memstrid = strid
memyear = str(datetime.datetime.now().year)
memtype = self.membership_type[0] if self.membership_type else ""
memid = memyear + memtype + memstrid
self.membership_id = memid
super().save(*args, **kwargs)
def __str__(self):
return self.name
视图.py
@api_view(['GET', 'POST'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_list(request):
if request.method == 'GET':
memberform = Memberform.objects.all()
serializer = MemberformSerializer(memberform, many=True)
return Response(serializer.data)
elif request.method == 'POST':
serializer = MemberformSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@api_view(['GET', 'PUT', 'DELETE'])
@authentication_classes([CsrfExemptSessionAuthentication, BasicAuthentication])
def memberform_detail(request, pk):
try:
memberform = Memberform.objects.get(pk=pk)
except Memberform.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
if request.method == 'GET':
serializer = MemberformSerializer(memberform)
return Response(serializer.data)
elif request.method == 'PUT':
serializer = MemberformSerializer(memberform, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
elif request.method == 'DELETE':
memberform.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
这是我在发帖时得到的回复, 请求后的响应
created_at: "2021-05-14T02:29:21.105382Z"
id: 31
membership_id: "2021S00None"
membership_type: "Silver"
...rest of the data
成员身份为2021S000none,此处无应为身份(pk)
如果不需要访问
Memberform
列表,而只需要为该视图创建Memberform
,则可以从视图支持的方法中删除'GET'
:关于从日期、id和类型字段构建的} model method 来做。这样,您就不必为创建
membership_id
字段,您所做的可能会起作用,但是如果您不需要仅针对此特定视图而总是针对您的模型的行为,那么您可以在模型级别通过overriding predefined ^{Memberform
对象的其他视图重复该字段的创建相关问题 更多 >
编程相关推荐