/

Django Rest Framework -3

Post Oluşturma API (CreateAPIView)

Önceki eğitim serimizde postumun için silme ve detay gibi özellikleri barındıran View’ler yazdık.Şimdi ise Postlarımız için create yani oluşturma API’si yazacağız.Halihazırda POSTAPP uygulamamıza gelip views.py dosyasına yeni bir view yazalım.

class PostCreateAPIView(CreateAPIView):
    queryset           = PostModel.objects.all()
    serializer_class   = PostCreateUpdateSerializer

Bir önceki dersimizi tekrar edecek olursak queryset ile modelimizi belirterek objects.all() methodunu çağırıyoruz. serializer_class ile de birazdan oluşturacağımız serializerın ismini veriyorum.Dikkat ederseniz PostCreateUpdateSerializer yaptım ismini. Yani bu serializer üzerinden hem güncelleme hem de yeni post oluşturma işlemlerini yapacağız.Ama önceliğimiz post oluşturma işlemi.

Şimdi ise serializers.py dosyamıza gelip PostCreateUpdateSerializer adında bir serializer oluşturalım.

class PostCreateUpdateSerializer(serializers.ModelSerializer):
    class Meta:
        model = PostModel
        fields = ["Title","Content",'Draft','Image']

 

Evet serializerımızı oluşturduk. Model sınıfımızın içerisine özel sınıf olan Meta sınıfını da yazıp model değişkenine oluşturmuş olduğumuz PostModel’ini veriyoruz. fields listesine ise postumuzu oluştururken istediğimiz alanları belirtiyoruz.

Şimdi modelimizin fieldlarını yani alanlarını hatırlamak için buraya bakalım.

class PostModel(models.Model):
    Author       = models.ForeignKey(User,on_delete=models.CASCADE)
    Title        = models.CharField(max_length=50)
    Content      = models.TextField()
    Draft        = models.BooleanField(default=False)
    CreatedDate  = models.DateTimeField(editable=False)
    ModifiedDate = models.DateTimeField(editable=False)
    Slug         = AutoSlugField(
    unique=True,editable=False,populate_from="Title")
    Image        = models.ImageField(
    upload_to="PostImages",null=True,blank=True)

DİKKAT

Oluşturmuş olduğumuz PostCreateUpdateSerializer serializer’imizin fields listesine PostModel’imizin Author yani kullanıcı/yazar alanını VERMEDİM.Bunun sebebi giriş yapmış kullanıcı post oluştururken direkt request üzerinden kullanıcımızı kayıt edeceğiz.Hadi buna geçelim.

Tekrar az önce oluşturmuş olduğumz view’imize gelelim ve şu methodu override edelim.

class PostCreateAPIView(CreateAPIView):
    queryset           = PostModel.objects.all()
    serializer_class   = PostCreateUpdateSerializer
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        serializer.save(Author=self.request.user)

Burada yaptıklarımızı anlatalım. perform_create methodu sayesinde nesnemiz veritabanına kayıt edilirken müdahaleler edebiliyoruz. serializers.save() diyerek Author’u yani yazarımızı self parametresinden gelen request.user sayesinde postu oluştururken otomatik olarak o an sisteme login olmuş kullanıcı tarafından kayıt edilecek.

Yazdığımız viewi deneyebilmemiz için urls.py dosyasına gelip path tanımlamalarımızı yapalım.

urls.py

urlpatterns = [
    path("list/",cache_page(60*1)(PostListAPIView.as_view()),name="postList"),
path("detail/<Slug>",PostDetailAPIView.as_view(),name="postDetail"),
    path("delete/<Slug>", PostDeleteAPIView.as_view(), name="postDelete"),
    path("create/", PostCreateAPIView.as_view(), name="postCreate"),
]

Path tanımlamalarımızı ve gerekli import işlemlerini de yaptığımıza göre oluşturduğumuz url’e gidip deneyebiliriz.

Gördüğünüz gibi post oluşturma sayfası geldi. Burada dikkat etmeniz gereken bu sayfada GET methoduna izin verilmediği yalnızca POST methoduna izin verildiğidir. Fark edeceğiniz üzere fields alanında belirttiğimiz alanlar buraya geldi. Author’u belirtmemiştik,Author otomatik olarak sisteme kayıt olacak. Bir örnek ile veritabanımıza post ekleyelim.

Evet HTTP 201 Created olarak olumlu geri dönüşümüzü de aldık. İstersek veritabanından ,istersek de admin panelimizden bunu görüntüleyerek doğrulayabiliriz.

ANCAK!

Burada bir sorun var. Eğer giriş yapmamış olsaydık ve post oluşturmaya çalışsaydık ne olacaktı? Postu hangi kullanıcı yazmış olacaktı,gelin deneyelim ve bu sorunu çözelim.

Django oturumunu kapatıp tekrardan oluşturduğumuz API üzerine giriş yapıyorum ve karşıma çıkan hata. Bazı durumlara göre POST etmeye çalıştıktan sonra da bu hata çıkabilir.

Gördüğünüz gibi AnonymousUser olarak hatamızı aldık. Bunun çözümü için büyük bir konu başlığı olan Permissions geliyor. İzinleri sonraki bölüm anlatıp detaylıca üstünden geçeceğiz…

Comments

    There are no comments yet.

Comment