1

I am learning Django and DRF, I am having issues updating the field expire_on. And there also I have to put the logic to prevent to put the value of expore_on no greater than 7 days from created_on. I am having trouble figuring out how to update the same and write the above logic.

I have tried:

  1. update function in DRF viewset.Viewset
  2. Django Rest Framework not showing form fields for PATCH/PUT request
  3. Django REST Framework doesn't display value in PUT form
  4. Django form fields not showing up

Models

class Url_data(models.Model):
    uri_id = models.AutoField(primary_key=True)
    actual_url = models.URLField()
    created_on = models.DateTimeField(
        auto_now_add=True, editable=False, auto_now=False)
    expire_on = models.DateTimeField()
    short_url = models.URLField(max_length=200, editable=False)
    clicks = models.PositiveBigIntegerField(
        default=0, editable=True, blank=True)

Serializer

class Url_dataSerializer(serializers.ModelSerializer):
    class Meta:
        model = Url_data
        fields = '__all__'
        read_only_fields = ['short_url', 'created_on', 'clicks']

class ExpireDateUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = Url_data
        fields = ('expire_on', )

View

class UrlList(generics.ListCreateAPIView):
    queryset = Url_data.objects.all()
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    serializer_class = Url_dataSerializer


class UrlDetail(generics.RetrieveDestroyAPIView):
    queryset = Url_data.objects.all()
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    serializer_class = Url_dataSerializer


class ExpireDateUpdate(generics.UpdateAPIView):
    queryset = Url_data.objects.all()
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]
    serializer_class = ExpireDateUpdateSerializer

URls (in-app)

urlpatterns = [
    path("", index, name="home"),
    path("urls/", UrlList.as_view()),
    path("urls/<int:pk>/", UrlDetail.as_view()),
    path("urls/<int:pk>/", ExpireDateUpdate.as_view()),
]

Error

405
Undocumented
Error: Method Not Allowed

**Response body**
{
  "detail": "Method \"PATCH\" not allowed."
}

**Response headers**
 access-control-allow-origin: * 
 allow: GET,DELETE,HEAD,OPTIONS 
 content-length: 42 
 content-type: application/json 
 cross-origin-opener-policy: same-origin 
 date: Fri,07 Jan 2022 22:19:09 GMT 
 referrer-policy: same-origin 
 server: WSGIServer/0.2 CPython/3.8.10 
 vary: Accept,Origin 
 x-content-type-options: nosniff 
 x-frame-options: DENY 

Please help, Thanks in advance.

Strike
  • 164
  • 1
  • 13
  • We can not see which url you hit when you get this error. So, are you sure you make the rewuest to the correct url and it's update view? – Marco Jan 07 '22 at 23:37
  • here ate the URLs, I updated! Please Suggest. – Strike Jan 08 '22 at 07:59
  • 1
    Use different urls for each view. That could not work that way. – Marco Jan 08 '22 at 09:29
  • 1
    path("urls//", ExpireDateUpdate.as_view()) never get hit , due to the url path("urls//", UrlDetail.as_view()), – Jisson Jan 08 '22 at 13:34
  • 1
    generics.RetrieveDestroyAPIView doesn't support PATCH method. Your calls to url " urls//" always use UrlDetail, To make it work use a different class in UrlDetail which support update. – Jisson Jan 08 '22 at 13:38
  • 1
    Use viewset instead of define each view for each method – Jisson Jan 08 '22 at 13:39

0 Answers0