Questão sobre o Django e usuário Auth

votos
1

questão de noob do Django:

Eu uso dango.contrib.auth para o gerenciamento de usuários do meu site. Mas agora, eu estou desenvolvendo a 'página de configurações', onde um usuário pode editar o seu primeiro nome, sobrenome e endereço de e-mail. Mas na página de configurações também quero uma caixa de seleção para newsletter.

As perguntas são: 1) Onde devo colocar campo boletim no banco de dados? 2) Como posso criar um formulário para editar essas informações?

Obrigado.

- ATUALIZAÇÃO -

Agora eu tenho isso em models.py:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique = True)
    favourite_color = models.CharField(max_length = 40)

e este por sua forms.py:

class UserSettingsForm(forms.ModelForm):

    class Meta:
        model = User
        exclude = ('password',)

    def save(self, commit=False):
        user = super(UserSettingsForm,self).save(commit)
        favourite_color = self.cleaned_data.get('favourite_color', '')
        if favourite_color and user.favourite_color is None:
            UserProfile(user=user).save()
        if not slug:
            UserProfile.objects.filter(user=user).delete()

        if not commit:
            user.save()
        return user

Estou um pouco confuso. Gostaria de editar informações como nome, sobrenome, e-mail e cor favorita na forma configurações, mas na verdade eu estou fazendo errado.

Publicado 28/04/2011 em 21:00
fonte usuário
Em outras línguas...                            


5 respostas

votos
6

Você quer olhar para os perfis de usuário .

EDIT: Em relação às formas, não há nada que você parar de usar duas formas? Acho Django ignora campos na solicitação HTTP que não correspondem a uma forma, assim que você poderia alimentar a pedido de duas formas. Ao renderizar um modelo, Django não gera as <form>etiquetas ou o botão enviar, assim que você acabou de colocar ambas as formas na mesma <form>. Algo parecido com isto na sua opinião (modificando um exemplo Django ):

def edit_user_view(request):
    if request.method == 'POST': # If the form has been submitted...
        # Two forms bound to the POST data
        userForm = UserForm(request.POST)
        profileForm = ProfileForm(request.POST)
        if userForm.is_valid() and userForm.is_valid():
            # All validation rules pass
            # Process the data in userForm. and profileForm.cleaned_data
            # ...
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        # Unbound forms
        userForm = UserForm()
        profileForm = ProfileForm()

    return render_to_response('edit_user.html', {
        'userForm': userForm,
        'profileForm': profileForm,
    })

E no modelo:

<form action="/contact/" method="post">{% csrf_token %}
` userForm`.`as_p `
` profileForm`.`as_p `
<input type="submit" value="Submit" />
</form>

Isto é realmente apenas um ponto de partida, mas eu não vejo nenhuma razão pela qual não pode trabalhar.

Respondeu 28/04/2011 em 21:09
fonte usuário

votos
0

Criar um novo modelo com uma referência ao modelo de usuário, e criar um ModelForm baseado no usuário, mas inclui campos adicionais.

class Subscription(models.Model):
    user = models.OneToOneField(User, null=True, blank=True, related_name='subscription')

class UserSettingsForm(forms.ModelForm):
    subscribed = forms.BooleanField(default=False)

    class Meta:
        model = User
        exclude = ('password',)

    def save(self, commit=False)
        user = super(UserSettingsForm,self).save(commit)
        subscribed = self.cleaned_data.get('subscribed', False)
        if subscribed and user.subscription is None:
            Subscription(user=user).save()
        if not subscribed:
            Subscription.objects.filter(user=user).delete()

        if not commit:
            user.save()
        return user

Você também vai querer passar em dados iniciais sobre informações de assinatura para a criação de formulário:

subscribed = user.subscription is not None
form = UserSettingsForm(instance=user, initial={subscribed=subscribed})

Eu deveria cuidar disso. Eu não tenho um exemplo pessoal ao meu lado no momento, mas isso é feito a partir da memória. Vou tentar atualizá-lo mais tarde hoje, se eu perdi nada.

Respondeu 28/04/2011 em 22:08
fonte usuário

votos
0

Você também pode usar a herança e deixar django gerir a economia.

class UserProfile(User):
    favourite_color = models.CharField(max_length = 40)

class UserProfileForm(forms.ModelForm):    
    class Meta:
        model = UserProfile
        exclude = ('password',)

Isto irá criar um campo de um-para-um em UserProfile apontando para usuário. Os campos do usuário serão salvas no modelo de usuário e o outro campo no modelo UserProfile.

Respondeu 29/04/2011 em 07:47
fonte usuário

votos
0

RESOLVIDO :

isso em forms.py:

    class UserProfileForm(forms.ModelForm):
        first_name = forms.CharField(label = 'First name', max_length = 40)
        last_name = forms.CharField(label = 'Last name', max_length = 40)
        email = forms.CharField(label = 'Email', max_length = 40)

        def __init__(self, *args, **kw):
            super(UserProfileForm, self).__init__(*args, **kw)
            self.fields['first_name'].initial = self.instance.user.first_name
            self.fields['last_name'].initial = self.instance.user.last_name
            self.fields['email'].initial = self.instance.user.email

        def save(self, *args, **kw):
            profile = super(UserProfileForm, self).save(*args, **kw)
            u = self.instance.user
            u.first_name = self.cleaned_data['first_name']
            u.last_name = self.cleaned_data['last_name']
            u.email = self.cleaned_data['email']
            u.save()
            return profile

        class Meta:
            model = UserProfile
            exclude = ('user', )

e na views.py:

def settings(request):
    user = request.user.get_profile()
    if request.method == 'POST':
        form = UserProfileForm(request.POST, instance = user)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('')

    form = UserProfileForm(instance = user)
    return render(request, "settings.html", {'form': form})
Respondeu 30/04/2011 em 01:30
fonte usuário

votos
0

Eu não sei se este é um bom caminho. Mas você não pode criar classe especial para você Perfil do usuário (ou você tem mais uma tabela na base de dados para pesquisa de usuário é mais lento).

Eu tentei fazer o seguinte :

{ utils.py }

class Utils:

        class ClassContributor: 

            @staticmethod
            def contribute_fields( object_class, *fields ):
                for val in fields:                      
                    field_name = val[ 0 ]
                    field = val[ 1 ]
                    field.contribute_to_class( object_class, field_name )


{ models.py }

    user_contributor = Utils.ClassContributor.contribute_fields(    
        User, 
        ( 'country', models.ForeignKey( Country, null = True ) ),
        ( 'region', models.ForeignKey( Region, null = True ) ),
        ( 'city', models.ForeignKey( City, null = True ) ),
    )

Neste caso, temos apenas uma tabela em um banco de dados (problema é: campos adicionados não é visível na administração do Django).

Vou procurar uma decisão do problema.

Respondeu 21/05/2011 em 10:27
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more