Django:为用户分配模型的实例

时间:2012-01-29 06:14:24

标签: django django-models django-forms

这是一个完全不同的问题,但我正在编辑并添加一个全新的问题,因为我解决了以前的问题。

无论如何,我有models.py:

from django.db import models
from django.contrib.auth.models import *
from django.utils.translation import gettext as _

class PLanguages(models.Model):
    plangs = models.CharField('Language', max_length=50)
    def __unicode__(self):
        return self.plangs

class Frameworks(models.Model):
    frameworks = models.CharField('Frameworks', max_length=50)
    def __unicode__(self):
        return self.frameworks

class Projects(models.Model):
    name = models.CharField('projectname', max_length=50)
    technologies = models.ManyToManyField(PLanguages)
    frameworks = models.ManyToManyField(Frameworks)
    image = models.ImageField('project_image', upload_to="img/users/projects")
    url = models.URLField('url', blank=True)

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True)
    fullname = models.CharField('Full Name', max_length=50)
    birthdate = models.DateTimeField('Birthday')
    url = models.URLField('Website', blank=True)
    company = models.CharField('Company', max_length=50)
    CATEGORY_CHOICES = (
            ('M',_('Male')),
            ('F',_('Female')),
            )
    gender = models.CharField('Gender', max_length=200, choices = CATEGORY_CHOICES)
    picture = models.ImageField('Picture/Avatar', upload_to='img/users/profile', blank=True)
    bio = models.TextField()
    projects = models.ManyToManyField(Projects)
    #planguages = models.ManyToManyField(PLanguages)
    #frameworks = models.ManyToManyField(Frameworks)

,在utils.py中:

def get_profile_model():
    """
    Return the model class for the currently-active user profile
    model, as defined by the ``AUTH_PROFILE_MODULE`` setting. If that
    setting is missing, raise
    ``django.contrib.auth.models.SiteProfileNotAvailable``.

    """
    if (not hasattr(settings, 'AUTH_PROFILE_MODULE')) or \
           (not settings.AUTH_PROFILE_MODULE):
        raise SiteProfileNotAvailable
    profile_mod = get_model(*settings.AUTH_PROFILE_MODULE.split('.'))
    if profile_mod is None:
        raise SiteProfileNotAvailable
    return profile_mod


def get_profile_form():
    """
    Return a form class (a subclass of the default ``ModelForm``)
    suitable for creating/editing instances of the site-specific user
    profile model, as defined by the ``AUTH_PROFILE_MODULE``
    setting. If that setting is missing, raise
    ``django.contrib.auth.models.SiteProfileNotAvailable``.

    """
    profile_mod = get_profile_model()
    class _ProfileForm(forms.ModelForm):
        #planguages = forms.ModelMultipleChoiceField(queryset=PLanguages.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)
        #frameworks = forms.ModelMultipleChoiceField(queryset=Frameworks.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)
        class Meta:
            model = profile_mod
            exclude = ('user',) # User will be filled in by the view.
    return _ProfileForm

def get_project_form():
    """
    Return a form class (a subclass of the default ``ModelForm``)
    suitable for creating/editing instances of the site-specific user
    profile model, as defined by the ``AUTH_PROFILE_MODULE``
    setting. If that setting is missing, raise
    ``django.contrib.auth.models.SiteProfileNotAvailable``.

    """
    profile_mod = get_profile_model()
    class _ProjectForm(forms.ModelForm):
        planguages = forms.ModelMultipleChoiceField(queryset=PLanguages.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)
        frameworks = forms.ModelMultipleChoiceField(queryset=Frameworks.objects.all(), required=False, widget=forms.CheckboxSelectMultiple)
        class Meta:
            model = Projects
            exclude = ('user',) # User will be filled in by the view.
    return _ProjectForm

,并在views.py中跟随:

def create_project(request, form_class=None, success_url=None,
                   template_name='profiles/create_profile.html',
                   extra_context=None):

    #
    # We set up success_url here, rather than as the default value for
    # the argument. Trying to do it as the argument's default would
    # mean evaluating the call to reverse() at the time this module is
    # first imported, which introduces a circular dependency: to
    # perform the reverse lookup we need access to profiles/urls.py,
    # but profiles/urls.py in turn imports this module.
    #

    if success_url is None:
        success_url = reverse('profiles_profile_detail',
                              kwargs={ 'username': request.user.username })
    if form_class is None:
        form_class = utils.get_project_form()
    if request.method == 'POST':
        form = form_class(data=request.POST, files=request.FILES)
        if form.is_valid():
            profile_obj = form.save(commit=False)
            profile_obj.user = request.user
            profile_obj.save()
            if hasattr(form, 'save_m2m'):
                form.save_m2m()
            return HttpResponseRedirect(success_url)
    else:
        form = form_class()

    if extra_context is None:
        extra_context = {}
    context = RequestContext(request)
    for key, value in extra_context.items():
        context[key] = callable(value) and value() or value

    return render_to_response(template_name,
                              { 'form': form },
                              context_instance=context)
create_project = login_required(create_project)

。现在,我可以创建一个项目,但问题是该项目没有分配给创建它的用户,但它只是一个项目,而不是分配给任何人。任何有关如何将其分配给创建它的用户的提示都将非常感激。

2 个答案:

答案 0 :(得分:2)

通过向user = models.ForeignKey(User, unique=False)类添加Projects来修复此问题。唯一的是False,因为用户可以拥有多个项目。

来自freenode上#django的积分。

答案 1 :(得分:0)

如果您希望打印项目名称,则需要添加

def __unicode__(self):
     return self.name

以便显示项目名称。否则它只显示Project对象的repr,这就是你所看到的。