Make progress with automatic form field for model autocompletion

This commit is contained in:
2021-12-31 22:29:47 +01:00
parent 258fd1747c
commit a0775a69ca
5 changed files with 97 additions and 17 deletions

View File

@@ -3,15 +3,56 @@ from django.forms import widgets
from django.core.exceptions import ValidationError
from parts import models as parts_models
from shimatta_modules.EngineeringNumberConverter import EngineeringNumberConverter
import uuid
class AutoCompleteWidget(widgets.Input):
template_name = 'widgets/autocomplete-foreign-key.html'
def __init__(self, api_search_url, image_field_name, foreign_model, *args, **kwargs):
super().__init__(*args, **kwargs)
self.image_field_name = image_field_name
self.foreign_model = foreign_model
self.api_search_url = api_search_url
def get_context(self, name, value, attrs):
context = super().get_context(name, value, attrs)
try:
instance = self.foreign_model.objects.get(id=uuid.UUID(value))
except Exception as ex:
print(ex)
instance = None
image = None
if instance is not None:
image = getattr(instance, self.image_field_name)
class AutoCompleteWidget(widgets.TextInput):
template_name = 'widgets/autrocomplete-foreign-key.html'
context['custom'] = {
'search_url': self.api_search_url,
'image_field_name': self.image_field_name,
'current_instance': instance,
'image': image,
}
return context
class AutocompleteForeingKeyField(forms.UUIDField):
def __init__(self, foreign_model=None, api_search_url=None, autocomplete_media_div=False, **kwargs):
kwargs['widget'] = AutoCompleteWidget
def __init__(self, foreign_model=None, api_search_url=None, image_field_name='image', **kwargs):
super().__init__(**kwargs)
self.widget = AutoCompleteWidget(api_search_url, image_field_name, foreign_model)
self.foreign_model = foreign_model
def clean(self, value):
pre_cleaned_uuid = super().clean(value)
if pre_cleaned_uuid is None and not self.required:
return None
try:
obj = self.foreign_model.objects.get(id=pre_cleaned_uuid)
except self.foreign_model.DoesNotExist:
raise ValidationError('Given element does not exist')
return obj
class MyTestForm(forms.Form):
pass
@@ -118,8 +159,9 @@ class AddStockForm(forms.Form):
new_stock.save()
class ComponentForm(forms.ModelForm):
manufacturer = AutocompleteForeingKeyField(widget=AutoCompleteWidget)
component_type = AutocompleteForeingKeyField()
manufacturer = AutocompleteForeingKeyField(api_search_url='foo', foreign_model=parts_models.Manufacturer)
component_type = AutocompleteForeingKeyField(api_search_url='bar', foreign_model=parts_models.ComponentType, required=False, image_field_name=None)
package = AutocompleteForeingKeyField(api_search_url='pkgurl', foreign_model=parts_models.Package, required=False)
class Meta:
model = parts_models.Component
fields = '__all__'

View File

@@ -521,7 +521,7 @@ class ComponentDetailView(LoginRequiredMixin, BaseTemplateMixin, DetailView):
context['edit_form'] = EditComponentForm(instance=self.object)
context['stocks'] = Stock.objects.filter(component=self.object)
context['comp_form'] = ComponentForm()
context['comp_form'] = ComponentForm(instance=self.object)
return context
@@ -546,10 +546,25 @@ class ComponentDetailView(LoginRequiredMixin, BaseTemplateMixin, DetailView):
context['edit_form'] = form
return self.render_to_response(context)
def handle_submit_edit_component_post(self, request, **kwargs):
context = self.get_context_data(**kwargs)
cform = ComponentForm(instance=self.object, data=request.POST, files=request.FILES)
if cform.is_valid():
print('valid')
cform.save()
else:
print('invalid')
context['comp_form'] = cform
return self.render_to_response(context)
def post(self, request, *args, **kwargs):
self.object = self.get_object()
if 'submit-edit-comp' in request.POST:
return self.handle_submit_edit_post(request, **kwargs)
if 'submit-edit-component' in request.POST:
return self.handle_submit_edit_component_post(request, **kwargs)
return super().post(request, *args, **kwargs)