Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/unfold/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
UnfoldAdminUUIDInputWidget,
UnfoldBooleanSwitchWidget,
UnfoldBooleanWidget,
UnfoldForeignKeyRawIdWidget,
)

try:
Expand Down Expand Up @@ -306,10 +307,14 @@ def formfield_for_choice_field(
def formfield_for_foreignkey(
self, db_field: ForeignKey, request: HttpRequest, **kwargs
) -> Optional[ModelChoiceField]:
db = kwargs.get("using")

# Overrides widgets for all related fields
if "widget" not in kwargs:
if db_field.name in self.raw_id_fields:
kwargs["widget"] = UnfoldAdminTextInputWidget()
kwargs["widget"] = UnfoldForeignKeyRawIdWidget(
db_field.remote_field, self.admin_site, using=db
)
elif (
db_field.name not in self.get_autocomplete_fields(request)
and db_field.name not in self.radio_fields
Expand Down
21 changes: 21 additions & 0 deletions src/unfold/templates/unfold/widgets/foreign_key_raw_id.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<div class="flex flex-row">
{% include 'django/forms/widgets/input.html' %}

{% if related_url %}
<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 }}">
<span class="material-symbols-outlined text-sm">search</span>
</a>
{% endif %}
</div>

{% if link_label %}
<strong class="mt-2 font-medium text-xs">
{% if link_url %}
<a href="{{ link_url }}" class="underline text-primary-500">
{{ link_label }}
</a>
{% else %}
{{ link_label }}
{% endif %}
</strong>
{% endif %}
20 changes: 20 additions & 0 deletions src/unfold/widgets.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Any, Callable, Dict, Optional, Tuple, Union

from django.contrib.admin.options import VERTICAL
from django.contrib.admin.sites import AdminSite
from django.contrib.admin.widgets import (
AdminBigIntegerFieldWidget,
AdminDateWidget,
Expand All @@ -13,8 +14,10 @@
AdminTextInputWidget,
AdminTimeWidget,
AdminUUIDInputWidget,
ForeignKeyRawIdWidget,
RelatedFieldWidgetWrapper,
)
from django.db.models.fields.reverse_related import ForeignObjectRel
from django.forms import (
CheckboxInput,
MultiWidget,
Expand Down Expand Up @@ -532,3 +535,20 @@ def __init__(

class UnfoldRelatedFieldWidgetWrapper(RelatedFieldWidgetWrapper):
template_name = "unfold/widgets/related_widget_wrapper.html"


class UnfoldForeignKeyRawIdWidget(ForeignKeyRawIdWidget):
template_name = "unfold/widgets/foreign_key_raw_id.html"

def __init__(
self,
rel: ForeignObjectRel,
admin_site: AdminSite,
attrs: Optional[Dict] = None,
using: Optional[Any] = None,
) -> None:
attrs = {
"class": " ".join(["vForeignKeyRawIdAdminField"] + INPUT_CLASSES),
**(attrs or {}),
}
return super().__init__(rel, admin_site, attrs, using)