1

I have two models - News and Subject. News model has a ManyToManyField related to Subject, like that:

subjects = models.ManyToManyField(NewsSubject, verbose_name=u'Subjects', blank=True,null=True,related_name='news')

And I need to have an ability not only to choose Subjects for News in admin, but also to choose News while editing Subject.

I'd started from creating model form:

class NewsSubjectForm(forms.ModelForm):

    news = ModelMultipleChoiceField(queryset=News.objects.all(), 
        label="News", 
        required=False,
        #initial=News.objects.all(),
    )

    class Meta:
        model = NewsSubject

Here is the question - how I should specify initial values for news according to reverse many-to-many relationship? And how to add a plus button for simple adding?

Enchantner
  • 1,534
  • 3
  • 20
  • 40

1 Answers1

2

I am not sure that it can meet your needs but i've done something similar by using TabularInline. Somethink like this should work (i didn't test the following code).

class Subject(models.Model):
    ...

class News(models.Model):
    subject = models.ManyToManyField(Subject, through="NewsSubject")

class NewsSubject(models.Model):
    news = models.ForeignKey(News)
    subject = models.ForeignKey(Subject)  

class NewsOfSubjectInline(admin.TabularInline):
    model = NewsSubject
    raw_id_fields = ('news',)

class SubjectAdmin(admin.ModelAdmin):
    inlines = [NewsOfSubjectInline,]

class SubjectOfNewsInline(admin.TabularInline):
    model = NewsSubject
    raw_id_fields = ('subject',)

class NewsAdmin(admin.ModelAdmin):
    inlines = [SubjectOfNewsInline,]
luc
  • 41,928
  • 25
  • 127
  • 172
  • Brilliant! And for friendly admin labels see - http://stackoverflow.com/questions/4929009/django-friendlier-header-for-stackedinline-for-auto-generated-through-model – Aidan Ewen Mar 11 '13 at 20:09