Wrote autocompletion for foreign key field
This commit is contained in:
@@ -4,49 +4,65 @@ from django.core.exceptions import ValidationError
|
||||
from parts import models as parts_models
|
||||
from shimatta_modules.EngineeringNumberConverter import EngineeringNumberConverter
|
||||
import uuid
|
||||
from django.urls import reverse
|
||||
|
||||
class AutoCompleteWidget(widgets.Input):
|
||||
template_name = 'widgets/autocomplete-foreign-key.html'
|
||||
|
||||
def __init__(self, api_search_url, image_field_name, foreign_model, *args, **kwargs):
|
||||
def __init__(self, api_search_url, image_field_name, foreign_model, name_field_name, *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
|
||||
self.name_field_name = name_field_name
|
||||
|
||||
def get_context(self, name, value, attrs):
|
||||
context = super().get_context(name, value, attrs)
|
||||
if value is not None:
|
||||
try:
|
||||
instance = self.foreign_model.objects.get(id=uuid.UUID(value))
|
||||
try:
|
||||
my_id = uuid.UUID(value)
|
||||
except:
|
||||
my_id = int(value)
|
||||
instance = self.foreign_model.objects.get(id=my_id)
|
||||
except Exception as ex:
|
||||
instance = None
|
||||
else:
|
||||
instance = None
|
||||
|
||||
image = None
|
||||
if instance is not None:
|
||||
if instance is not None and self.image_field_name is not None:
|
||||
image = getattr(instance, self.image_field_name)
|
||||
|
||||
display_name = None
|
||||
if instance:
|
||||
display_name = getattr(instance, self.name_field_name)
|
||||
|
||||
context['custom'] = {
|
||||
'search_url': self.api_search_url,
|
||||
'search_url': reverse(self.api_search_url),
|
||||
'image_field_name': self.image_field_name,
|
||||
'current_instance': instance,
|
||||
'image': image,
|
||||
'name_field_name': self.name_field_name,
|
||||
'name': display_name,
|
||||
}
|
||||
return context
|
||||
|
||||
|
||||
class AutocompleteForeingKeyField(forms.UUIDField):
|
||||
def __init__(self, foreign_model=None, api_search_url=None, image_field_name='image', **kwargs):
|
||||
def __init__(self, foreign_model=None, api_search_url=None, image_field_name='image', name_field_name='name', **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.widget = AutoCompleteWidget(api_search_url, image_field_name, foreign_model)
|
||||
self.widget = AutoCompleteWidget(api_search_url, image_field_name, foreign_model, name_field_name)
|
||||
self.foreign_model = foreign_model
|
||||
|
||||
|
||||
def clean(self, value):
|
||||
pre_cleaned_uuid = super().clean(value)
|
||||
try:
|
||||
pre_cleaned_uuid = super().clean(value)
|
||||
except Exception as ex:
|
||||
try:
|
||||
pre_cleaned_uuid = int(value)
|
||||
except:
|
||||
raise ex
|
||||
if pre_cleaned_uuid is None and not self.required:
|
||||
return None
|
||||
try:
|
||||
@@ -161,9 +177,9 @@ class AddStockForm(forms.Form):
|
||||
new_stock.save()
|
||||
|
||||
class ComponentForm(forms.ModelForm):
|
||||
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)
|
||||
manufacturer = AutocompleteForeingKeyField(api_search_url='manufacturer-list', foreign_model=parts_models.Manufacturer, required=False)
|
||||
component_type = AutocompleteForeingKeyField(api_search_url='componenttype-list', foreign_model=parts_models.ComponentType, name_field_name='class_name', required=False, image_field_name=None)
|
||||
package = AutocompleteForeingKeyField(api_search_url='package-list', foreign_model=parts_models.Package, required=False)
|
||||
class Meta:
|
||||
model = parts_models.Component
|
||||
fields = '__all__'
|
||||
|
Reference in New Issue
Block a user