Skip to content

Commit be9a677

Browse files
authored
fix: raw id fields (#424)
1 parent 74a2c35 commit be9a677

3 files changed

Lines changed: 47 additions & 1 deletion

File tree

src/unfold/admin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
UnfoldAdminUUIDInputWidget,
7272
UnfoldBooleanSwitchWidget,
7373
UnfoldBooleanWidget,
74+
UnfoldForeignKeyRawIdWidget,
7475
)
7576

7677
try:
@@ -306,10 +307,14 @@ def formfield_for_choice_field(
306307
def formfield_for_foreignkey(
307308
self, db_field: ForeignKey, request: HttpRequest, **kwargs
308309
) -> Optional[ModelChoiceField]:
310+
db = kwargs.get("using")
311+
309312
# Overrides widgets for all related fields
310313
if "widget" not in kwargs:
311314
if db_field.name in self.raw_id_fields:
312-
kwargs["widget"] = UnfoldAdminTextInputWidget()
315+
kwargs["widget"] = UnfoldForeignKeyRawIdWidget(
316+
db_field.remote_field, self.admin_site, using=db
317+
)
313318
elif (
314319
db_field.name not in self.get_autocomplete_fields(request)
315320
and db_field.name not in self.radio_fields
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<div class="flex flex-row">
2+
{% include 'django/forms/widgets/input.html' %}
3+
4+
{% if related_url %}
5+
<a href="{{ related_url }}" class="related-lookup related-widget-wrapper-link view-related bg-white border cursor-pointer flex items-center h-9.5 justify-center ml-2 rounded shadow-sm shrink-0 text-gray-400 text-sm w-9.5 hover:text-gray-700 dark:bg-gray-900 dark:border-gray-700 dark:text-gray-500 dark:hover:text-gray-200" id="lookup_id_{{ widget.name }}" title="{{ link_title }}">
6+
<span class="material-symbols-outlined text-sm">search</span>
7+
</a>
8+
{% endif %}
9+
</div>
10+
11+
{% if link_label %}
12+
<strong class="mt-2 font-medium text-xs">
13+
{% if link_url %}
14+
<a href="{{ link_url }}" class="underline text-primary-500">
15+
{{ link_label }}
16+
</a>
17+
{% else %}
18+
{{ link_label }}
19+
{% endif %}
20+
</strong>
21+
{% endif %}

src/unfold/widgets.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Any, Callable, Dict, Optional, Tuple, Union
22

33
from django.contrib.admin.options import VERTICAL
4+
from django.contrib.admin.sites import AdminSite
45
from django.contrib.admin.widgets import (
56
AdminBigIntegerFieldWidget,
67
AdminDateWidget,
@@ -13,8 +14,10 @@
1314
AdminTextInputWidget,
1415
AdminTimeWidget,
1516
AdminUUIDInputWidget,
17+
ForeignKeyRawIdWidget,
1618
RelatedFieldWidgetWrapper,
1719
)
20+
from django.db.models.fields.reverse_related import ForeignObjectRel
1821
from django.forms import (
1922
CheckboxInput,
2023
MultiWidget,
@@ -532,3 +535,20 @@ def __init__(
532535

533536
class UnfoldRelatedFieldWidgetWrapper(RelatedFieldWidgetWrapper):
534537
template_name = "unfold/widgets/related_widget_wrapper.html"
538+
539+
540+
class UnfoldForeignKeyRawIdWidget(ForeignKeyRawIdWidget):
541+
template_name = "unfold/widgets/foreign_key_raw_id.html"
542+
543+
def __init__(
544+
self,
545+
rel: ForeignObjectRel,
546+
admin_site: AdminSite,
547+
attrs: Optional[Dict] = None,
548+
using: Optional[Any] = None,
549+
) -> None:
550+
attrs = {
551+
"class": " ".join(["vForeignKeyRawIdAdminField"] + INPUT_CLASSES),
552+
**(attrs or {}),
553+
}
554+
return super().__init__(rel, admin_site, attrs, using)

0 commit comments

Comments
 (0)