Django MTMField: limit_choices_to = other_ForeignKeyField_on_same_model?

Вам это нравилось?

Измените свой CSS следующим образом

.custom-table> tbody {
    display:block;
    height:50px;
    overflow:auto;
}
.custom-table> thead, tbody tr {
    display:table;
    width:100%;         
}
.custom-table> thead {
    width:   100%   
}
.custom-table {
    width:100%;
}
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

<div class="table-responsive">
  <table class="table table-striped table-hover custom-table text-nowrap">
    <thead>
      <tr>
        <th>row1</th>
        <th>row2</th>
        <th>row2</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>text1</td>
        <td>text2</td>
        <td>text3</td>
      </tr>
      <tr>
        <td>text4</td>
        <td>text5</td>
        <td>text6</td>
      </tr>
      <tr>
        <td>text7</td>
        <td>text8</td>
        <td>text9</td>
      </tr>
    </tbody>
  </table>
</div>

5
задан Paco 8 September 2013 в 00:00
поделиться

3 ответа

Я удалил бы site поле на моем Photo модель и добавляет a ForeignKey кому: Gallery. Я удалил бы limit_choices_to от photos поля на Gallery модель.

Поскольку Вы используете ForeignKeys к Sites, который означает, сайты не совместно используют галереи и фотографии. Поэтому имея их я упомянул выше, уже бесполезно.

class Photo(models.Model):
    title = models.CharField(max_length=100)
    gallery = models.ForeignKey(Gallery, related_name='photos')
    file = models.ImageField(upload_to=get_site_profile_path) 

    def __unicode__(self):
        return self.title


class Gallery(models.Model):    
    name = models.CharField(max_length=40)
    site = models.ForeignKey(Site)

    def __unicode__(self):
        return self.name

После того как Вы устанавливаете site на галерее все его фотографии наследуют это свойство. И сайт будет доступен как photo_instance.gallery.site:

@property
def site(self):
    return self.gallery.site

Это должно работать, как будто у Вас был a site поле. Но я не протестировал его.

Изменение вещей или курс, если Вы решаете, что галерея или фотография могут появиться в нескольких сайтах.

1
ответ дан 14 December 2019 в 19:29
поделиться

Согласно документам, "limit_choices_to не имеет никакого эффекта при использовании на ManyToManyField с промежуточной таблицей". Моим чтением, которое означает, это не имеет никакого эффекта вообще, потому что ManyToManyFields используют промежуточные таблицы...

Я не попытался заставить его работать в Администраторском сайте, но от Ваших собственных представлений, можно создать форму и переопределить queryset, используемый для заполнения списка выбора:

form.fields["photos"].queryset = request.user.photo_set.all()
0
ответ дан 14 December 2019 в 19:29
поделиться

Да. Вам необходимо переопределить форму, которую администратор использует для модели Галерея , а затем ограничить набор запросов поля фотографий в этой форме:

class GalleryAdminForm(django.forms.ModelForm):

    class Meta:
        model = Gallery

    def __init__(self, *args, **kwargs):
        super(GalleryAdminForm, self).__init__(*args, **kwargs)
        self.fields['segments'].queryset = Photo.objects.filter(site=self.instance.site)


class GalleryAdmin(django.contrib.admin.ModelAdmin):
    form = GalleryAdminForm

django.contrib.admin.site.register(Gallery, GalleryAdmin)
4
ответ дан 14 December 2019 в 19:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: