简体   繁体   中英

Django, link a model field with an admin model field with ForeignKey

I'm trying to link a "normal" model field with an admin model field, for example I have a table "Post" and I want to add the admin username as a ForeignKey to the field "Author" of the table Post.

I mean:

class Post(models.Model):
    title = models.CharField(max_length=50)
    body = RichTextField(blank=True, null=True)
    date = models.DateTimeField('date_posted')
    username = models.ForeignKey(admin.username, on_delete=models.CASCADE)

Where admin.username refers the username of auth_user admin model

Thanks for your help

How about something like this?

class Post(models.Model):
    title = models.CharField(max_length=50)
    body = RichTextField(blank=True, null=True)
    date = models.DateTimeField('date_posted')
    user = models.ForeignKey(auth_user, on_delete=models.CASCADE)

    @property
    def username(self): return self.user.username 

Usage:

some_post = Post.objects.get(id='the_post_id')
print(some_post.username) # prints some_post.user.username

As the referencing the user model section of the documentation says, you can make use of settings.AUTH_USER_MODEL to obtain a reference to the user model that is used. You can use the to_field=… [Django-doc] to specify to what field of the model it should refer, so:

from django.conf import settings

class Post(models.Model):
    title = models.CharField(max_length=50)
    body = RichTextField(blank=True, null=True)
    date = models.DateTimeField('date_posted')
     = models.ForeignKey(
        ,
        
        on_delete=models.CASCADE,
        
    )

By specifying editable=False [Django-doc] it will not automatically show up in ModelForm s.

In views, you can then set the logged in user as author by specifing the author attribute. For example:

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect

@login_required
def some_view(request):
    if request.method == 'POST':
        form = PostForm(request.POST)
        if form.is_valid():
            form.instance.author = request.user
            form.save()
            return redirect('name-of-some-view')
    else:
        form = PostForm()
    return render(request, 'some_template.html', {'form': form})

Note : A ForeignKey does not store the string representation (or name) of the referenced object in the column, it stores the primary key of the record it references in a column with an _id suffix to a ForeignKey field. Therefore ForeignKey s usually do not end with a _name suffix. You might want to consider renaming the username field to author .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM