Как использовать updateview с ForeignKey / OneToOneField

#django #django-class-based-views

#django #django-представления на основе классов

Вопрос:

 class ModTool(models.Model):
...
issue = models.OneToOneField(Issue)
priority = models.CharField(max_length=1, choices=PRIORITY, blank=True)
status = models.CharField(max_length=1, choices=STATUS, default='O', blank=True)
  

url

 url(r'^moderate/(?P<pk>d )', ModEdit.as_view(),name='moderation')
  

Вид

 class Modedit(UpdateView):

    model = ModTool
    template_name = 'myapp/moderate.html'
    fields = ['priority','status']
  

На данный момент я не могу понять, как настроить это представление для редактирования конкретного экземпляра ModTool, который имеет onetoonefield с проблемой, указанной в pk.

Ответ №1:

slug_field Для этого вы можете использовать атрибуты slug_url_kwarg and:

 url(r'^moderate/(?P<issue_id>d )', ModEdit.as_view(),name='moderation')

class Modedit(UpdateView):
    slug_field = 'issue_id'
    slug_url_kwarg = 'issue_id'
    model = ModTool
    template_name = 'myapp/moderate.html'
    fields = ['priority','status']
  

Это позволит выполнить поиск по issue_id=<issue_id> тому, где issue_id находится первичный ключ проблемы, как указано в URL.

Я переименовал аргумент ключевого pk issue_id слова в, чтобы предотвратить столкновение имени с поиском первичного ключа. В противном случае будет выполняться дополнительный фильтр, который фильтрует по ModTool первичному ключу со значением для Issue первичного ключа.

Комментарии:

1. Спасибо. как вы это поняли? Документы являются наиболее запутанными, когда дело доходит до CBV. Кстати, если я позже добавлю поле slug в свою модель проблем, будет ли оно по-прежнему работать? Извините, но CBV очень сбивают меня с толку.

2. @yayu Если вы позже добавите поле slug, вы сможете выполнить поиск по отношениям, как вы привыкли, т.Е. slug_field = 'issue__slug_field' . Мои знания о CBV в основном основаны на опыте и чтении исходного кода, но недавно я нашел на сайте классные представления на основе классов , что является очень полезным ресурсомэто собирает весь исходный код и встроенную документацию для определенного класса на одной странице.