У меня есть модель разговора для добавления топи c, и мне нужно добавить различные категории. Итак, с django mptt я создал две модели. кажется, что в принципе это работает. Но только с панелью администратора Django. Если я пытаюсь создать разговор из оставшегося браузера, категория поля не отображается в форме. В чем будет причина? Спасибо.
Это мой код:
models.py
class Conversacion(models.Model):
creado_a_las = models.DateTimeField(auto_now_add = True) #Aunque no se la mostraremos al usuario, es una buena práctica tener esto en cuenta
actualizado_a_las = models.DateTimeField(auto_now = True)
texto = models.CharField(max_length=480)
contenido = models.CharField(max_length=90) # Es en realidad el titulo
slug = models.SlugField(max_length=500, unique=True) #Para saber los detalles de un aporte en cuestión
autor = models.ForeignKey(settings.AUTH_USER_MODEL,
on_delete= models.CASCADE,
related_name= "autor")
categoria = models.ForeignKey('Category', on_delete= models.CASCADE,)
def __str__(self):
return self.contenido
class Category(MPTTModel):
name = models.CharField(max_length=80, unique=True)
parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, default= 1, blank=True, related_name='subcategoria')
class MPTTMeta:
order_insertion_by = ['name']
class Meta:
verbose_name_plural = 'categories'
def __str__(self):
return self.name
serializers.py
class ConversacionSerializer(serializers.ModelSerializer):
autor = serializers.StringRelatedField(read_only= True)
creado_a_las = serializers.SerializerMethodField()
actualizado_a_las = serializers.SerializerMethodField()
slug = serializers.SlugField(read_only = True)
respuesta_cuenta = serializers.SerializerMethodField()
usuario_ha_respondido = serializers.SerializerMethodField()
class Meta:
model = Conversacion
fields = '__all__'
depth = 2
def get_usuario_ha_respondido(self, instance):
request = self.context.get("request")
return instance.respuesta.filter(autor=request.user).exists()
# Clase para la vista
class CategorySerializer(serializers.ModelSerializer):
subcategoria = RecursiveField(many=True,allow_null=True)
class Meta():
model= Category
fields=['id','name','subcategoria']
views.py
class ConversacionViewSet(viewsets.ModelViewSet):
queryset = Conversacion.objects.all().order_by("-creado_a_las")
lookup_field = "slug"
serializer_class = ConversacionSerializer
permission_classes = [IsAuthenticated, IsAuthorOrReadOnly]
def perform_create(self, serializer):
serializer.save(autor=self.request.user)
class CategoryListCreateAPIView(generics.ListCreateAPIView):
permission_classes = [IsAuthenticated, IsAdminUser]
serializer_class = CategorySerializer
def get_queryset(self):
return Category.objects.exclude(parent__isnull=False)
class CategoryRUDAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = Category.objects.all()
serializer_class = CategorySerializer
permission_classes = [IsAuthenticated, IsAdminUser]
urls.py
router = DefaultRouter()
router.register(r"conversaciones" , qv.ConversacionViewSet)
urlpatterns = [
path("", include(router.urls)),
path("categorias/", qv.CategoryListCreateAPIView.as_view(), name = "crear-categoria"),
path("categorias/<int:pk>/", qv.CategoryRUDAPIView.as_view(), name = "detalle-categoria"),
]