(self, **kwargs)
| 232 | template_name = "admin_doc/model_detail.html" |
| 233 | |
| 234 | def get_context_data(self, **kwargs): |
| 235 | model_name = self.kwargs["model_name"] |
| 236 | # Get the model class. |
| 237 | try: |
| 238 | app_config = apps.get_app_config(self.kwargs["app_label"]) |
| 239 | except LookupError: |
| 240 | raise Http404(_("App %(app_label)r not found") % self.kwargs) |
| 241 | try: |
| 242 | model = app_config.get_model(model_name) |
| 243 | except LookupError: |
| 244 | raise Http404( |
| 245 | _("Model %(model_name)r not found in app %(app_label)r") % self.kwargs |
| 246 | ) |
| 247 | |
| 248 | opts = model._meta |
| 249 | if not user_has_model_view_permission(self.request.user, opts): |
| 250 | raise PermissionDenied |
| 251 | |
| 252 | title, body, metadata = utils.parse_docstring(model.__doc__) |
| 253 | title = title and utils.parse_rst(title, "model", _("model:") + model_name) |
| 254 | body = body and utils.parse_rst(body, "model", _("model:") + model_name) |
| 255 | |
| 256 | # Gather fields/field descriptions. |
| 257 | fields = [] |
| 258 | for field in opts.fields: |
| 259 | # ForeignKey is a special case since the field will actually be a |
| 260 | # descriptor that returns the other object |
| 261 | if isinstance(field, models.ForeignKey): |
| 262 | data_type = field.remote_field.model.__name__ |
| 263 | app_label = field.remote_field.model._meta.app_label |
| 264 | verbose = utils.parse_rst( |
| 265 | ( |
| 266 | _("the related `%(app_label)s.%(data_type)s` object") |
| 267 | % { |
| 268 | "app_label": app_label, |
| 269 | "data_type": data_type, |
| 270 | } |
| 271 | ), |
| 272 | "model", |
| 273 | _("model:") + data_type, |
| 274 | ) |
| 275 | else: |
| 276 | data_type = get_readable_field_data_type(field) |
| 277 | verbose = field.verbose_name |
| 278 | fields.append( |
| 279 | { |
| 280 | "name": field.name, |
| 281 | "data_type": data_type, |
| 282 | "verbose": verbose or "", |
| 283 | "help_text": field.help_text, |
| 284 | } |
| 285 | ) |
| 286 | |
| 287 | # Gather many-to-many fields. |
| 288 | for field in opts.many_to_many: |
| 289 | data_type = field.remote_field.model.__name__ |
| 290 | app_label = field.remote_field.model._meta.app_label |
| 291 | verbose = _("related `%(app_label)s.%(object_name)s` objects") % { |
nothing calls this directly
no test coverage detected