1

User継承を使用してDjangoでモデルを拡張しようとしています。これが私のモデルです:

class Paciente (User):
    Carteira = models.CharField(max_length=50, 
        verbose_name="Num Carteira Plano Saude",unique=True)
    Convenio = models.ForeignKey(Operadora,'Descricao', related_name="convenio", 
        verbose_name="Convenio",unique=True)
    DDD = models.CharField(max_length=2, verbose_name="DDD")
    Telefone = models.CharField(max_length=10, verbose_name="Telefone")

そして、これが私の見解です:

def paciente_register(request):
    PacienteFormSet = modelformset_factory(Paciente)

    if request.method == 'POST':
        form = PacienteFormSet(request.POST or None, 
            request.FILES or None, queryset=Paciente.objects.none(), 
            initial=[{
                'is_staff': False,
                'is_active': True, 
                'is_superuser': False, 
                'date_joined': datetime.now(), 
                'last_login': datetime.now()
            }]
        ) #incluir
        if form.is_valid():
            instance = form.save(commit=False) #pre-salva o registro
            for logvalue in instance:  # repoe os valores 'hidden' de log
                logvalue.is_staff = False
                logvalue.is_active = True
                logvalue.is_superuser = False
                logvalue.date_joined = datetime.now()
                logvalue.last_login = datetime.now()
            for reform in instance:  # salva no banco
                reform.save()
        else:
            return HttpResponseRedirect('/erro/')
    else:
        form = PacienteFormSet(queryset=Paciente.objects.none(), 
            initial=[{
                'is_staff':False,
                'is_active': True,
                'is_superuser': False,
                'date_joined': datetime.now(),
                'last_login': datetime.now()
            }]
        ) #incluir
    return render_to_response('register.html', {'form': form,}, context_instance=RequestContext(request))

そして、最後になりましたが、私のテンプレート:

<form enctype="multipart/form-data" method="POST" action="/paciente_register/" >{% csrf_token %}
{{ form.management_form }}
   {% for formy in form.forms %}
      {{ formy.username.label_tag}}:{{formy.username}}<br>
      {{ formy.password.label_tag}}:{{formy.password}}<br>
      {{ formy.Carteira.label_tag}}:{{formy.Carteira}}<br>
      {{ formy.Convenio.label_tag}}:{{formy.Convenio}}<br>
      {{ formy.DDD.label_tag}}:{{formy.DDD}}<br>
      {{ formy.Telefone.label_tag}}:{{formy.Telefone}}<br>
      {{formy.is_staff.as_hidden}}
      {{formy.is_active.as_hidden}}
      {{formy.is_superuser.as_hidden}} 
      {{formy.date_joined.as_hidden}}
      {{formy.last_login.as_hidden}}

    {% endfor %}   
    <input type="submit" name="submit" value="Salvar" />
</form>

ユーザーは自分で登録することになっていますが、ビュー内とテンプレートで設定している他のフィールドを非表示にしているため、一部のフィールドのみを編集するためのアクセス権があります。

しかし、問題は私のフォームが検証されていないということです。私は多くの調査を行いましたが、インターネット上のほんの数例が継承を使用してUserモデルを拡張しています。そして、これは、アプリケーション内でユーザーの登録を行うビューがどのようになるかを示していません。

どんな助けでも大歓迎です!:)

4

2 に答える 2

0

結局のところ、問題は視野にありました。datetime.now()Django管理テンプレートに従っているため、フィールド「date_joined」と「last_login」を強制的に受信していました。残念ながら、これは正しくなく、ユーザーを追加しようとするたびにエラーテンプレートにジャンプしていました。これは、フォームが正しく入力されなかったことを意味します。解決策は、これらのフィールドを受信させることでしたがdate.today()、現在は正常に機能しています。

このモデルの継承はまだあまりうまく機能していないと思います(Python2.7とDjango1.3)。モデルで使用するときは、Djangoがデータベース内にどのようなフィールドを作成しているかを確認してください。これにより、多くの問題を回避できます。

于 2012-08-22T14:35:05.313 に答える
0

一般的に、モデルの継承は正常に機能しており、重大な問題は発生していないと思います。ユーザーモデルに関しては、私はあまり経験がありませんが、おそらくあなたの問題は、Djangoによって提案されたようにそれを行っていないという事実に起因していますか?

あなたが興味を持っている場合に備えて、いくつかのより興味深い投稿:h

于 2012-08-23T06:42:09.817 に答える