Как я могу повторно использовать представление Django с методом post для моего API
В настоящее время я пытаюсь создать API с DRF на моем бэкенде для мобильного приложения.
Я хотел бы узнать, можно ли повторно использовать некоторые уже реализованные методы POST, передавая им запрос в качестве параметра.
Спасибо,
Вот вид, о котором идет речь:
Меня интересует метод POST.
Я попробовал следующий код, я не знаю, хорошо ли это или есть лучший способ сделать это
class TestPost(views.APIView):
permission_classes = (permissions.AllowAny,)
def __init__(self):
request = WSGIRequest({
'REQUEST_METHOD': 'POST',
'wsgi.input': StringIO(),
})
request.POST = QueryDict('csrfmiddlewaretoken=x9ceGh2r5yxBot8dqY4rBgKpOMCmqUzpSM937ZoBZ93TA0jRyHzfb5lDPpEfrUA0&name=cat0&order=3&category_image=image&form-TOTAL_FORMS=2&form-INITIAL_FORMS=0&form-MIN_NUM_FORMS=0&form-MAX_NUM_FORMS=1000&form-0-product=6/unit&form-0-quantity=123&form-1-product=5/unit&form-1-quantity=258', mutable=True)
a= ShopModuleCategoryCreateView()
a.has_permission()
a.post(request=request)
Я бы предложил перенести вашу бизнес-логику в специальный метод в services.py
и использовать новый метод в вашем представлении API и вашем существующем представлении django.
Следующий код - это просто черновик, чтобы показать намерение, он может быть не готов к копированию и вставке и не работать. Но идея должна быть ясна, что нужно делать.
services.py
def service_function(shop, module, category_name=None, category_order=None, category_image=None, cat_form_cleaned_data=None):
if category_name and category_order and category_image:
category = Category.objects.create(
name=category_name,
order=category_order,
module=module,
shop_id=shop.pk,
category_image=category_image,
)
logger.error(shop.id)
for product_form in (cat_form_cleaned_data or []):
try:
product = Product.objects.get(
pk=product_form['product'].split('/')[0])
if product.unit:
quantity = int(product_form['quantity'])
else:
quantity = 1
CategoryProduct.objects.create(
category=category,
product=product,
quantity=quantity
)
except ObjectDoesNotExist:
pass
except KeyError:
pass
views.py
class ShopModuleCategoryCreateView(ShopModuleMixin, BorgiaView):
# your existing code ...
def post(self, request, *args, **kwargs):
"""
Permet de publier la creation d'une nouvelle categorie
cat_name_form => renvoie une objet Form avec le nom et l'ordre entré
self.module => Module de vente en libre service du magasin Pi
"""
f = open("myfile.txt", "a")
f.write(str(request))
cat_name_form = ModuleCategoryCreateNameForm(request.POST)
category_name = None
category_order = None
category_image = None
if cat_name_form.is_valid():
cat_form = self.form_class(request.POST)
category_name=cat_name_form.cleaned_data['name']
category_order=cat_name_form.cleaned_data['order']
category_image=cat_name_form.cleaned_data['category_image']
service_function(
shop=self.shop,
module=self.module,
category_name=cat_name_form.cleaned_data['name'],
category_order=cat_name_form.cleaned_data['order'],
category_image=cat_name_form.cleaned_data['category_image'],
cat_form_cleaned_data=cat_form.cleaned_data,
)
return redirect(self.get_success_url())
# your code ...
api/views.py
class TestPost(views.APIView):
permission_classes = (permissions.AllowAny,)
def post(self, request):
# add your code to determine the data from the API request
service_function(shop, module, category_name, category_order, category_image, cat_form_cleaned_data, ...)
# your API code