Django community: RSS
This page, updated regularly, aggregates Django Q&A from the Django community.
-
Django: @action Method \"GET\" not allowed
I have an issue with one of my ViewSets that I don't know what to do about. It seems the methods I want to add using action are not registered properly and I get a MethodNotAllowedError. Here's a stripped-down version: from drf_spectacular.utils import extend_schema from rest_framework import mixins, viewsets, status from rest_framework.decorators import action from rest_framework.response import Response from error_database.models import DeviceConfigType from error_database.permissions import AllowAnyReadAccessOrHasWritePermission from error_database.serializers import DeviceConfigTypeSerializer class DeviceConfigTypeViewSet( mixins.CreateModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet ): queryset = DeviceConfigType.objects.all() serializer_class = DeviceConfigTypeSerializer lookup_field = "type" permission_classes = [AllowAnyReadAccessOrHasWritePermission] def get_queryset(self): return self.queryset.filter(release=self.kwargs['release_version_number']) def create(self, request, *args, **kwargs): # (some code) return Response(status=status.HTTP_201_CREATED) def destroy(self, request, *args, **kwargs): # (some code) return Response(status=status.HTTP_204_NO_CONTENT) @extend_schema( request=DeviceConfigTypeSerializer, responses={status.HTTP_201_CREATED: DeviceConfigTypeSerializer(many=True)}, ) @action( detail=True, methods=['get'], url_path=r'versions', url_name='config-type-list-versions', ) def list_versions(self, request, *args, **kwargs) -> Response: # (some code) return Response(status=status.HTTP_200_OK) @action( detail=True, methods=['get'], url_path=r'versions/(?P<version_id>\d+\.\d{1,3})', url_name='config-type-version-get', ) def get_version(self, request, *args, **kwargs): # (some code) return Response(status=status.HTTP_200_OK) @action( detail=True, methods=['delete'], url_path=r'versions/(?P<version_id>\d+\.\d{1,3})', url_name='config-type-version-delete', ) def destroy_version(self, request, *args, **kwargs): # (some code) return Response(status=status.HTTP_204_NO_CONTENT) The model in the background should handle two different keys: "config_type" and "version_id", with an API like this: /releases/{release_version_number}/config_type/{config_type}/versions/{version_id} I have working tests for the ViewSets like this: view = DeviceConfigTypeViewSet.as_view({'get': 'get_version'}) response … -
How to get boolean value from a JSONfield in Django?
I stored data into a JSONField in the form below, but when I access the data the boolean value remains as a string. What is the proper way to tell Django to automatically convert it into boolean ? obj.js = {"fast": 3, "slow": 6, "shift": "True", "signal": 2} obj.save() > obj.js['shift'] "True" I would like to avoid doing eval(obj.js['shift']) for security reason. -
Where is the best place to put external service client in Django?
Is there any best practice to put external service client code in Django? I want the client to be initialized only once and can be used globally in Django? For example I want to integrate ClickHouse and Meilisearch into Django, where I can put the clients? -
Django running async code in WSGI mode causes SynchronousOnlyOperation error
Our Django 4.1 website is running on a WSGI server. We are not ready to convert the entire website to ASGI but we rewrote an io-intensive operation in asyncio mode and called it in the view function as follows: async def utility_func(urls): await asyncio.gather(download_from_urls) class MyView(generic.edit.FormView) def form_valid(self, form): asyncio.run(utility_func(form.cleaned_data['urls'])) In our view, this has nothing to do with Django's async support because the view function is running in sync mode and the server is running on WSGI and there is no system event loop. However, when the view functions runs a little longer (e.g. > 5s), we notice some other parts of the website start to throw exceptions like SynchronousOnlyOperation You cannot call this from an async context - use a thread or sync_to_async. This happens to requests such as our health-check call path("is_alive/", lambda x: HttpResponse()), They are all straight sync views and have never thrown the SynchronousOnlyOperation exceptions before. Can anyone tell us what is happening here? The best guess we have is that when the asyncio.run() is running, the lambda function, which performs a completely unrelated task, is somehow executed in the async environment and causes the exception. If this is the case, how can we … -
How to seed a django model with foreign key and many to many fields at the same time?
i want to know the method of seeding for m2m and foreign key fields in a model of django automatically i use django fixtures but it is all manual system. i would like to know to automated way to do the fill the database.I want to know is there any way to make it rather than fixtures in eaborative way. -
Django manage test outputting progress percentage
I use Django 3.2 to run some tests using python -m manage test --parallel --verbosity=3. In other projects, I use pytest and this gives a test suite percentage on the right: How can one get Django's manage test to output something similar? -
Is there a way to determine which django db a pytest test function is currently running against?
Is there a way to know which database a test is currently running against from within the test itself? i.e. I have a test setup like so, and I have two databases configured pytestmark = pytest.mark.django_db(databases=["db1", "db2"]) def test_case_1(fixture_stuff): print("What db is this running on?") Is there a way for me to add the current db to that print statement? -
array is not acting like an array and i don't know what to do
I am making a react application with django backend. So for protected routes i am doing something like this. <Route element={<RequireAuth allowedRoles={['admin']}/>}> <Route path='admin' element={<Admin />} /> </Route> And in RequireAuth.js I have this: const RequireAuth = (allowedRoles) => { const location = useLocation() const userdata= JSON.parse(localStorage.getItem('user')) || {} return ( (allowedRoles.includes(userdata.user.role)) ? <Outlet /> : userdata?.token ? <Navigate to='/unauthorized' state={{ from: location }} replace /> :<Navigate to='/login' state={{ from: location }} replace /> ) } Doing this also causes the same error, how do I use props in react if not like this :( (allowedRoles.includes(localStorage.getItem('user.role'))) With some help from a youtube tutorial by Dave Gray, as his method wasn't working, i just opted to use local storage cause i am getting tired but even using local storage, i get the same error allowedRoles.includes is not a function TypeError: allowedRoles.includes is not a function But allowedRoles is an array I think, I had this <Route element={<RequireAuth allowedRoles='[admin]'/>}> didn't work so I did this <Route element={<RequireAuth allowedRoles={['admin']}/>}> still No. In my login I am storing the userdata response as const response = await axios.post(`http://localhost:8000/login/`, JSON.stringify({ email, password }),{headers:{"Content-Type":"application/json"}}) console.log(JSON.stringify(response.data)) localStorage.setItem('user',JSON.stringify(response.data) || []) This is the console log: {"token":"2a4d51f5f7132564115e89310487115ba4138c46","user":{"id":1,"email":"admin@admin.com","first_name":"admin","last_name":"admin","role":"admin"}} I am using … -
How to Add additional data while redirect a page - Django
I'm working on this project using Django, here in views.py this function return all listing which are active to index.html. def index(request): # Get all listings where active field is True lists = Listing.objects.filter(active=True) return render(request, "auctions/index.html", { "lists": lists, # additional key and value is needed while redirecting this route from another route }) so it has also another routes, and this one is where I need your help @login_required(login_url="/login") def closebid(request, list_id): if request.method == "POST": # get the the user user = request.user # get the item form db lists = Listing.objects.get(pk=list_id) # get it from the database if not lists: . .. # check if it exist check the user have the permission user.id == listing.user.id if not user.id == lists.user.id: return HttpResponse(f"{user.username} are trying to close objects you don't own!") # Change the active field to False lists.active = False print("This objects is ", lists.active) # Remove the list from watch list where listing = closed list lists, user, winningbid = get_winner(lists) # Add the winner from the db and add it to BidWinner winner = BidWinner(user=user, winningbid=winningbid) # then add it to list # winner.save() # winner.listings.add(lists) # Then redirect the user to index … -
I am using django and my login form is not working
I have a login form in index.html file and in same file I have login form by clicking in login button I want message to displayed you logged in and some buttons will visible. But I am not getting any response i view.py i tried to print something in terminal to check login_view is getting called or not but i got nothing. I am not getting any error message too. My html code- <form method="POST" action="{% url 'login_view' %}" id="login-form"> <h5>Login Here</h5> {% csrf_token %} <input type="email" class="input-field" placeholder="Email" id="mail" name="email"><br> <input type="password" class="input-field" placeholder="Password" id="loginpass" name="password"><br> <button id="login" type="submit">LOGIN</button><br> </form> my view.py code- def login_view(request): print("View accessed") if request.method == 'POST': email = request.POST['email'] password = request.POST['password'] user = authenticate(request, email__iexact=email, password=password) if user is not None: login(request, user) messages.success(request, 'You are logged in ') return redirect('home') else: messages.error(request, 'Invalid email or password.') else: messages.error(request, 'Error in login.') return render(request, 'index.html') my url code- from django.contrib import admin from django.urls import path from PMP import views from PMP import views urlpatterns = [ path('admin/', admin.site.urls), path('',views.home, name='home'), path('register/', views.register_view, name='register'), path('', views.login_view, name='login_view'), ] -
When we apply the migration process, It can't done correctly, error occurs
Applying branches.0002_remove_branch_district_remove_branch_sub_areas_and_more...Traceback (m ost recent call last): File "C:\Users\user\AppData\Local\Programs\Python\Python39\lib\site-packages\django\db\backen ds\utils.py", line 89, in _execute return self.cursor.execute(sql, params) File Migration process not done -
cannot static file through static url using django.test.client
1.env python : 3.8.14 django version : '4.2.4' 2.Purpose Make sure that the static file is saved Make sure that the static file can be accessed from the web browser 3.Issue The problem is that after running django server, the static file can be accessed through url, but not in the unitest environment. For example, suppose a file is stored in the following path 'MAPPER #<- project dir |-datasets #<-app name |-static |-datasets |-images |-Recursion Cellular Image Classification.jpeg 3.1 Access the browser after running the server enter the following path into the browser to confirm that it works well. http://localhost:8000/static/datasets/static/datasets/images/Recursion Cellular Image Classification.jpeg 3.2 unittest get a 404 status code. and cannot get the image file from django.test import Client client = Client() res_redirect = self.client.get(res.url) 4. try I tried using requests.get , but i didn't work requests.get(http://localhost:8000/static/datasets/static/datasets/images/Recursion Cellular Image Classification.jpeg) 5. Question SO this is my question, how can i access file through url in unittest env -
Am I doing CSRF right?
I'm making a website that's business in the front, but all Django in the back. Django is what concerns me. Each request asks for a CSRF token. Actually, two tokens. One is set automatically by a cookie, and another has to be provided as a POST argument. So I have an API endpoint that sends a token. Then I use that token to make other requests. But this feels like having a guard who won't let you in without a password, but will gladly tell you the password if you ask him for it. Whom does this help? -
Django Rest Framework, two different approach to POST request
i have question about two different approaches in DRF (Django Rest Framework) regarding POST request. So my question is if it is better to keep view and serializer simpler with Approach 2 in beginning or is it more common to start with approach 1 because in this case it is more likely I would need .create() method in future? Approach 1: // view.py class ExampleView1(APIView): def post(self, request): data = request.data serializer = CourseSerializer(data=data, context={"request": request}, partial=True) if serializer.is_valid(raise_exception=True): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) // serializer .create() method class ExampleSerializer(ModelSerializer): def create(self, validated_data): user = self.context.get("request").user return Course.objects.create(**validated_data, owner=user) Approach 2: class ExampleView2(APIView): def post(self, request): data = request.data data["owner"] = request.user.pk serializer = CourseSerializer(data=data) if serializer.is_valid(raise_exception=True): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) -
Specify multiple targets to the django migration command
I am planning to load a bunch of data from elsewhere another environment into my development database. The problem is that the data source is not necessarily from the most recent version. I have a list of apps:migration_levels, that I can migrate too. But there does not seem to be a good way give the migration command multiple targets. how can I do somthing like this: ./manage.py migrate postapp:0020 commentapp:0015 userapp:0008 We tried looping and doing one app at a time, but ran into problems with cross dependencies. If there is a library that provides a version of this command, that would also be a valid answer. -
Why is my Django CreateView not able to create multiple records for work experience using formsets?
I am currently working on a Django project where I'm implementing a Candidate Profile creation feature using the CreateView class. The Candidate Profile consists of general candidate information as well as multiple work experience records. To achieve this, I have created a form class for the candidate information (CandidateForm) and a formset for the work experience records (WorkExperienceFormSet). Here's how I've set up my CandidateProfileCreateView: class CandidateProfileCreateView(CreateView): form_class = CandidateForm model = Candidate_Account template_name = "candidate_create_profile.html" def get(self, request, *args, **kwargs): candidate_form = CandidateForm() workexperience_formset = WorkExperienceFormSet(queryset=WorkExperience.objects.none()) return render( request, self.template_name, { 'candidate_form': candidate_form, 'workexperience_formset': workexperience_formset, } ) def post(self, request, *args, **kwargs): candidate_form = CandidateForm(request.POST, request.FILES) workexperience_formset = WorkExperienceFormSet(data=request.POST) if candidate_form.is_valid() and workexperience_formset .is_valid(): candidate_object = candidate_form.save() workexperience_instances = workexperience_formset.save(commit=False) for workexperience_instance in workexperience_instances: workexperience_instance.candidate = candidate_object workexperience_instance.save() return HttpResponseRedirect(self.get_success_url(candidate_object)) return render( request, self.template_name, { 'candidate_form': candidate_form, 'workexperience_formset': workexperience_formset, } ) def get_success_url(self, candidate_object): return reverse('candidate_profile', kwargs={'pk': candidate_object.pk}) My problem is that although the candidate information is being saved correctly, I'm facing issues when trying to create multiple work experience records using the formset. The formset is not able to create or save the work experience instances as expected. I've verified that both the candidate_form and workexperience_formset are valid … -
syncing products with d-stripe
I am having trouble syncing the products from my Stripe account to my django project. I've successfully synced the products, but I also inadvertently synced my entire stripe purchase and payment history to my django project. I followed most of this tutorial which describes how to set up stripe subscriptions on your django site using dj-stripe. When it came time to adding my products, the tutorial says to use this command: python manage.py djstripe_sync_plans_from_stripe But that command did not work for me. The command that did work for me was python manage.py djstripe_sync_models This worked but it literally downloaded all of my stripe data and synced it to my django project, which was unnecessary. I just wanted to sync the subsription products that I created. How can I sync only the products from my stripe account? -
Is it possible to run a django pytest that has access to multiple databases, without executing the test against each database?
I have a Django project in which I'm trying to add a second database, however I'm having a hard time getting my existing test suite to cooperate. I'm utilizing django==3.2.16, pytest==6.2.2 along with pytest-django==4.3.0. I seem to be running into two problems: I'm seeing tests fail with an error like such AssertionError: Database queries to 'second' are not allowed in this test. Add 'second' to pytest_django.fixtures._django_db_fixture_helper.<locals>.PytestDjangoTestCase.databases to ensure proper test isolation and silence this failure. From what I've found through issues and documentation is that I can do something like this to configure the test to have permission to the second db pytestmark = pytest.mark.django_db(databases=['default', 'second']) By having this at the top of my test file, it seems all the tests within have access to 'second', but this comes with the side effect that the test is now run TWICE, on each of the databases. [gw0] [ 2%] PASSED src/app/tests/test_some_stuff.py::test_case_1 [gw0] [ 2%] ERROR src/app/tests/test_some_stuff.py::test_case_1 That is not the behaviour I'm looking for. I need the test to be run once, with access to both databases, and I can't seem to find an existing solution for this. Is what I'm trying to accomplish possible within my existing toolset/versions? -
Context doesn`t send to the render_to_string Python/Django
hi guys I have a Django view that I want to filter my products with ajax(Js) and I think u know that I need to show the products to template too! Im using render to string Function which gets a template name and a context(dictionary) and return the string of the template , now my problem is my , idk why but my context is not sending to the template , if u have ever used Pycharm u know that for example when u map a template , if every thing is ok it will shows the template icon in the left near the line number! and every things is ok for me but still context doesnt send :( , i should say that I have a for loop in my template and I think u Know that too , when u click on your for loop context it will move you to the context in view but for me it shows "Cannot find the Declaration" ill write my codes , and ill be thankful if u guys help me :D ( and I have tried context: {"asd": asd} , {"asd": asd} every methods for a template: {% for product … -
Extracting JSON from API response using .json() causes entire Django view to run multiple times
On a locally-hosted Django server, I'm using the requests module to send an request to an external API. For example, this code works fine: from django.http import HttpResponse import requests url = "https://rapidapi.com" apiKey = "MY-KEY" apiHost = "isitwater-com.p.rapidapi.com" headers = { "X-RapidAPI-Key": apiKey, "X-RapidAPI-Host": apiHost } locationParameters = { "latitude": "32", "longitude": "-26" } response = requests.get(url, headers=headers, params=locationParameters) print(response) def generatePage(request): return HttpResponse() And outputs what I'd expect: <Response [200]> But when I try to get the JSON from the (supposedly) successful request using .json(), the entire view runs twice and then throws an error. For example, this code: from django.http import HttpResponse import requests url = "https://rapidapi.com" apiKey = "MY-KEY" apiHost = "isitwater-com.p.rapidapi.com" headers = { "X-RapidAPI-Key": apiKey, "X-RapidAPI-Host": apiHost } locationParameters = { "latitude": "32", "longitude": "-26" } response = requests.get(url, headers=headers, params=locationParameters) print(response) print(response.json()) def generatePage(request): return HttpResponse() Outputs the following: <Response [200]> <Response [200]> Exception in thread django-main-thread: Traceback (most recent call last): File "C:\Users\Derek\Desktop\World Color Map\World_Color_Map-xFfPFma1\Lib\site-packages\requests\models.py", line 971, in json return complexjson.loads(self.text, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Derek\AppData\Local\Programs\Python\Python311\Lib\json\__init__.py", line 346, in loads return _default_decoder.decode(s) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Derek\AppData\Local\Programs\Python\Python311\Lib\json\decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Derek\AppData\Local\Programs\Python\Python311\Lib\json\decoder.py", line 355, in raw_decode raise … -
django channel websocket failed
in my frontend which is built with vue js , alongside npm run serve ( running outside docker) the webscocket throw this error WebSocket connection to 'ws://localhost:8000/ws/notifications/' failed: My infrsactructure in docker , is looking like this Backend Code of Backend\Backend\asgi.py """ ASGI config for Backend project. It exposes the ASGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/4.2/howto/deployment/asgi/ """ import os from django.core.asgi import get_asgi_application from channels.routing import ProtocolTypeRouter, URLRouter from channels.auth import AuthMiddlewareStack # Setting the default Django settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Backend.settings') # Import the WebSocket routing from your notifications app (not the Backend app) import notifications.routing # Create the ProtocolTypeRouter and include both the standard Django application # and the websocket application from the routing you've created in your notifications app. application = ProtocolTypeRouter({ "http": get_asgi_application(), "websocket": AuthMiddlewareStack( URLRouter(notifications.routing.websocket_urlpatterns) ), }) Code of Backend\Backend\wsgi.py """ WSGI config for Backend project. It exposes the WSGI callable as a module-level variable named ``application``. For more information on this file, see https://docs.djangoproject.com/en/4.2/howto/deployment/wsgi/ """ import os from django.core.wsgi import get_wsgi_application os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Backend.settings') application = get_wsgi_application() Code of Backend\Backend\settings.py """ Django settings for Backend project. Generated by 'django-admin startproject' using Django 4.2.4. For more information on … -
Django CORS error in media file | Nginx | React
I am trying to fetch image from my django server from my react app. Tried multiple configuration but nothing to rescue. It would be great if anyone could provide any insight or leads or something I am missing React Using react behind nginx (on client machine) so origin is always http://127.0.0.1 instead of http://localhost:3000 import axios from "axios" export async function getImageFromNginx() { const IMAGE_URL = "http://{SERVER_URL}/media/pages/64d3d8cb4d3bd545823595e4.png" const config = { mode: 'cors', // no-cors, *cors, same-origin headers: { 'Access-Control-Allow-Origin' : 'http://127.0.0.1', 'Access-Control-Allow-Credentials': 'true', }, auth: {'username': 'username', 'password':'password'}, withCredentials: true, } console.log(config) try{ const response = await axios.get(IMAGE_URL, config).then((res)=>console.log("in axios",res)) console.log('Call to Nginx') return await response.json(); }catch(error) { return []; } } Django in django settings for cors, have installed django-cors-headers and added app and middleware settings CORS_ALLOWED_ORIGINS = ['http://127.0.0.1'] CORS_ALLOW_CREDENTIALS = True CORS_ALLOW_HEADERS = ['Content-Type', 'Access-Control-Allow-Origin'] CORS_ALLOW_METHODS = ['GET', 'POST', 'OPTIONS'] Django Method to serve file using nginx (on server) def send_file(roots, file_name, disposition_type=None, default_file_name=None): valid = ['/download/{}'.format(root) for root in roots \ if os.path.exists(get_absolute_filename(root,file_name))] if valid: response = HttpResponse() response['Content-Type'] = '' if disposition_type is not None: end_user_filename = default_file_name and default_file_name or file_name response['Content-Disposition'] = "{}; filename={}".format( disposition_type, end_user_filename) response['X-Accel-Redirect'] = os.path.join(valid[0], file_name) response['Access-Control-Allow-Origin'] = 'http://127.0.0.1/' … -
Is returning list of app_name + codename of permissions for currently logged in user a security risk in django?
I have an app named "todos" and inside this app I have a permission code named "add_todo", Is it a bad idea to return app name + code name(todos.add_todo) as a mechanism to control which buttons and UI to show to user in the Frontend? I currently wrote an endpoint that returns all of the user's permissions as a list in this format: "app_name.permission__codename". I was wondering whether this would pose a security risk or not. Also it's worth noting that only currently logged in user can see his/her own permissions. -
Django cannot import name 'Response' from 'rest_framework'
I have a Django rest_framework project which is working fine. I am using pipenv and used it to install django_rest_framework. I can import functions such as serializer from rest_framework and use them without problems. I would like to use rest_framework's Response class as givenhere and described here, so I wrote from rest_framework import Response This is not faulted by VSCode's syntax checks. However, when I start the server I receive the message cannot import name 'Response' from 'rest_framework' All help welcome -
Is it possible to stop the PyCharm debugger from exiting after an exception from Django shell?
I started the PyCharm debugger with python manage.py shell so I could interactively debug my Django project. However, if I run into an error, the debugger just exits. If I run python manage.py shell directly in a terminal this is not an issue. The same error will happen, but it doesn't just kick me out of the shell. Is there a way to have the same functionality while debugging in PyCharm?