Closed GeoMaciolek closed 1 year ago
Should be fixed now
Has this been deployed to djangobuilder.io? If so, I'm still having issues (shown below).
I haven't yet managed to get this running locally (some sort of firebase issue, not surprising given I've literally never used it), so I can't test the recent commit. Will keep trying, though!
Error as it stands (truncated):
File "/home/geo/simplertest/simplerapp/urls.py", line 4, in <module>
from . import api
File "/home/geo/simplertest/simplerapp/api.py", line 23, in <module>
class simplerabstractViewSet(viewsets.ModelViewSet):
File "/home/geo/simplerapp/api.py", line 26, in simplerabstractViewSet
queryset = models.simplerabstract.objects.all()
AttributeError: type object 'simplerabstract' has no attribute 'objects'
Looks like one or two other places this exists. I may try to submit a pull request on this, but given I can't test as of yet, I'm reluctant to do so! Example, in how api.py
is generated by rendering.js
:
api_py(projectid, appid) {
let api = 'from rest_framework import viewsets, permissions\n'
api += '\n'
--- old-rendering.js 2023-06-11 23:30:25.710385735 -0400
+++ src/django/rendering.js 2023-06-11 23:10:08.810616020 -0400
@@ -965,7 +965,7 @@
api += 'from . import serializers\n'
api += 'from . import models\n'
- const models = this.get_models(appid);
+ const models = this.get_models(appid).filter(model => !model.abstract);
models.forEach((model) => {
api += '\n\n'
api += 'class ' + model.name + 'ViewSet(viewsets.ModelViewSet):\n'
api += ' """ViewSet for the ' + model.name + ' class"""\n'
api += '\n'
api += ' queryset = models.' + model.name + '.objects.all()\n'
api += ' serializer_class = serializers.' + model.name + 'Serializer\n'
api += ' permission_classes = [permissions.IsAuthenticated]\n'
})
return api
}
Overview
django_builder creates an entry in
admin.py
for abstract models. (It apparently shouldn't?)Test Environment
Tested & verified on:
Issue
Steps
Expected Behavior
Actual Behavior
Project fails to run
manage.py
- for example with the following:django.core.exceptions.ImproperlyConfigured: The model abstractmodel1 is abstract, so it cannot be registered with admin.
Example
models.py
```python from django.db import models from django.urls import reverse class model1(models.Model): # Fields name = models.TextField(max_length=100) created = models.DateTimeField(auto_now_add=True, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) class Meta: pass def __str__(self): return str(self.name) def get_absolute_url(self): return reverse("app1_model1_detail", args=(self.pk,)) def get_update_url(self): return reverse("app1_model1_update", args=(self.pk,)) @staticmethod def get_htmx_create_url(): return reverse("app1_model1_htmx_create") def get_htmx_delete_url(self): return reverse("app1_model1_htmx_delete", args=(self.pk,)) class model2(models.Model): # Relationships somrelationship = models.ManyToManyField("app1.model1", related_name='mym2') # Fields created = models.DateTimeField(auto_now_add=True, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) description = models.TextField(max_length=100) class Meta: pass def __str__(self): return str(self.pk) def get_absolute_url(self): return reverse("app1_model2_detail", args=(self.pk,)) def get_update_url(self): return reverse("app1_model2_update", args=(self.pk,)) @staticmethod def get_htmx_create_url(): return reverse("app1_model2_htmx_create") def get_htmx_delete_url(self): return reverse("app1_model2_htmx_delete", args=(self.pk,)) class abstractmodel1(models.Model): # Fields last_updated = models.DateTimeField(auto_now=True, editable=False) created = models.DateTimeField(auto_now_add=True, editable=False) class Meta: abstract = True def __str__(self): return str(self.pk) def get_absolute_url(self): return reverse("app1_abstractmodel1_detail", args=(self.pk,)) def get_update_url(self): return reverse("app1_abstractmodel1_update", args=(self.pk,)) @staticmethod def get_htmx_create_url(): return reverse("app1_abstractmodel1_htmx_create") def get_htmx_delete_url(self): return reverse("app1_abstractmodel1_htmx_delete", args=(self.pk,)) class child1absmodel1(abstractmodel1): # Fields created = models.DateTimeField(auto_now_add=True, editable=False) last_updated = models.DateTimeField(auto_now=True, editable=False) class Meta: pass def __str__(self): return str(self.pk) def get_absolute_url(self): return reverse("app1_child1absmodel1_detail", args=(self.pk,)) def get_update_url(self): return reverse("app1_child1absmodel1_update", args=(self.pk,)) @staticmethod def get_htmx_create_url(): return reverse("app1_child1absmodel1_htmx_create") def get_htmx_delete_url(self): return reverse("app1_child1absmodel1_htmx_delete", args=(self.pk,)) ```admin.py
```python from django.contrib import admin from django import forms from . import models class model1AdminForm(forms.ModelForm): class Meta: model = models.model1 fields = "__all__" class model1Admin(admin.ModelAdmin): form = model1AdminForm list_display = [ "name", "created", "last_updated", ] readonly_fields = [ "name", "created", "last_updated", ] class model2AdminForm(forms.ModelForm): class Meta: model = models.model2 fields = "__all__" class model2Admin(admin.ModelAdmin): form = model2AdminForm list_display = [ "created", "last_updated", "description", ] readonly_fields = [ "created", "last_updated", "description", ] class abstractmodel1AdminForm(forms.ModelForm): class Meta: model = models.abstractmodel1 fields = "__all__" class abstractmodel1Admin(admin.ModelAdmin): form = abstractmodel1AdminForm list_display = [ "last_updated", "created", ] readonly_fields = [ "last_updated", "created", ] class child1absmodel1AdminForm(forms.ModelForm): class Meta: model = models.child1absmodel1 fields = "__all__" class child1absmodel1Admin(admin.ModelAdmin): form = child1absmodel1AdminForm list_display = [ "created", "last_updated", ] readonly_fields = [ "created", "last_updated", ] admin.site.register(models.model1, model1Admin) admin.site.register(models.model2, model2Admin) admin.site.register(models.abstractmodel1, abstractmodel1Admin) admin.site.register(models.child1absmodel1, child1absmodel1Admin) ```Output