elithrar
elithrar

Reputation: 24260

Referencing a Django contrib.admin user via a foreign key?

I'm developing a small Django site and I'm using django.contrib.admin to handle content management. I'd like to capture the first name & last name of the author (an Admin user) of an Article on its initial save (and not update it if another user edits the Article).

ie.

class Article(models.Model)
    title = models.CharField(max_length=50)
    pub_date = models.DateTimeField('date published')
    author = ForeignKey(???)
    ...

What do I need to write to grab this user's first name & last name fields when creating a new Article object? I'd default to their admin username if those fields are blank.

Upvotes: 1

Views: 773

Answers (3)

Dolan Antenucci
Dolan Antenucci

Reputation: 15942

Have your model use the User object:

author = models.ForeignKey(User)

To prevent this field from being changeable on update, check out this other SO post:
Django admin: exclude field on change form only

To change the admin's Select field to use first/last name, you could try this snippet:
http://djangosnippets.org/snippets/1642/

To change the admin's view, assuming you are using the built-in templates, you could add a custom column as described on this post: How do I add a custom column with a hyperlink in the django admin interface?

class AuthorAdmin(admin.ModelAdmin):
list_display = ('author_name',)

def my_author_name(self, obj):
    if obj.author.first_name and obj.author.last_name:
        return '%s %s' % (obj.author.first_name, obj.author.last_name)
    else: 
        return obj.author.username
my_author_name.allow_tags = True
my_author_name.short_description = 'Author'

Upvotes: 4

elithrar
elithrar

Reputation: 24260

It looks like the best way to handle a None or blank result from get_full_name is to just populate User.author with models.ForeignKey(User) and then — at the template level — use the following:

{{ user.get_full_name|default:user.username }}

... via this SO answer. This allows me to perform queries on a User's Articles, but still gracefully handles blank first_name & last_name fields if a User hasn't entered them yet, but will also update dynamically when they have).

Upvotes: 0

user201788
user201788

Reputation:

I think you are looking for this:

author = models.ForeignKey(User)

Upvotes: 1

Related Questions