You  can do that with proxy models which allows you to override and add
methods.

Of course if there is a need to really modify original model it gets tricky.

la 27. heinäk. 2019 klo 10.49 אורי <[email protected]> kirjoitti:

> Hi,
>
> I had to change the following lines because tests failed:
>
> class Friend1(object):
>     def __str__(self):
>         return "User {} is friends with {}".format(self.to_user, 
> self.from_user)
>
>
> class FriendshipRequest1(object):
>     def __str__(self):
>         return "Friendship request from user {} to {}".format(self.from_user, 
> self.to_user)
>
>
> Friend.__str__ = Friend1.__str__
> FriendshipRequest.__str__ = FriendshipRequest1.__str__
>
>
> אורי
> [email protected]
>
>
> ‪On Sat, Jul 27, 2019 at 9:26 AM ‫אורי‬‎ <[email protected]> wrote:‬
>
>> Django users,
>>
>> I want to override def __str__ of models I'm using, but the models are
>> maintained by other developers. I think the __str__ is only used by the
>> admin interface. I found out that I can do something like this:
>>
>> from django.contrib import admin
>> from django.contrib.sites.models import Site
>> from django.contrib.auth.models import Group
>>
>> from friendship.models import Follow, Friend, FriendshipRequest, Block
>>
>>
>> class ReadOnlyModelAdmin(admin.ModelAdmin):
>>     """
>>     ModelAdmin class that prevents modifications through the admin.
>>
>>     The changelist and the detail view work, but a 403 is returned
>>     if one actually tries to edit an object.
>>     """
>>     actions = None
>>
>>     # We cannot call super().get_fields(request, obj) because that method 
>> calls
>>     # get_readonly_fields(request, obj), causing infinite recursion. Ditto 
>> for
>>     # super().get_form(request, obj). So we assume the default ModelForm.
>>     def get_readonly_fields(self, request, obj=None):
>>         return self.fields or [f.name for f in self.model._meta.fields]
>>
>>     def has_add_permission(self, request):
>>         return False
>>
>>     # Allow viewing objects but not actually changing them.
>>     def has_change_permission(self, request, obj=None):
>>         return (request.method in ['GET', 'HEAD'] and 
>> super().has_change_permission(request, obj))
>>
>>     def has_delete_permission(self, request, obj=None):
>>         return False
>>
>>
>> admin.site.unregister(Site)
>> admin.site.register(Site, ReadOnlyModelAdmin)
>>
>> admin.site.unregister(Group)
>> # admin.site.register(Group, ReadOnlyModelAdmin)
>>
>> admin.site.unregister(Block)
>> admin.site.unregister(Follow)
>> admin.site.unregister(Friend)
>> admin.site.unregister(FriendshipRequest)
>> # admin.site.register(Block, ReadOnlyModelAdmin)
>> # admin.site.register(Follow, ReadOnlyModelAdmin)
>> admin.site.register(Friend, ReadOnlyModelAdmin)
>> admin.site.register(FriendshipRequest, ReadOnlyModelAdmin)
>>
>>
>> class Friend1(Friend):
>>     def __str__(self):
>>         return "User {} is friends with {}".format(self.to_user, 
>> self.from_user)
>>
>>
>> class FriendshipRequest1(FriendshipRequest):
>>     def __str__(self):
>>         return "Friendship request from user {} to 
>> {}".format(self.from_user, self.to_user)
>>
>>
>> Friend.__str__ = Friend1.__str__
>> FriendshipRequest.__str__ = FriendshipRequest1.__str__
>>
>> But, is it possible override __str__ in a cleaner way? It seems to me not
>> such a clean way to override a method (but it works). But I have to use the
>> model itself, because there is a lot of code in the package I'm using that
>> uses the model itself.
>>
>> (We are using our own Block model which I think we developed before they
>> developed a similar model. We are not using their Follow model too).
>>
>> אורי
>> [email protected]
>>
> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/CABD5YeHNUEozN0vg_M5Hz9QrCTUAzH--u9SHtPVeDvJ4ZgWeOA%40mail.gmail.com
> <https://groups.google.com/d/msgid/django-users/CABD5YeHNUEozN0vg_M5Hz9QrCTUAzH--u9SHtPVeDvJ4ZgWeOA%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CAHn91odhu6Dtaxq%3DtVA5vmWSPmJUyRL42o--h--awBm3BHVjpw%40mail.gmail.com.

Reply via email to