2016-09-03 9 views
2

Djangoの初心者のWebアプリケーションです。django - 既存のコードをModelFormインスタンスに変更する方法

私はDjangoののModelForm機能に問題を抱えていると私は知りたいと思った:

私はのModelFormのインスタンスを作成できるように、どのように私は私のコードを変更しない、具体的には、どのように私は、フォームデータを抽出することができますバックエンドにアップロードしますか? update_profileビューで同じデータを再入力するためにこのインスタンスを後で参照する必要がありますが、アップデートはユーザーがサインインとプロファイルの作成後にログインした後にのみ発生します。

編集セクションではpk=some_record.pkを使用しますか?非常に混乱して、どんな助けもありがとう。

私はCustomerDetailで働いているモデルがCustomerモデル参照する外部キーフィールドcustomerた:ここ

class CustomerDetail(models.Model): 
    phone_regex = RegexValidator(regex = r'^\d{10}$', message = "Invalid format! E.g. 4088385778") 
    date_regex = RegexValidator(regex = r'^(\d{2})[/.-](\d{2})[/.-](\d{2})$', message = "Invalid format! E.g. 05/16/91") 

    customer = models.OneToOneField(Customer, 
    on_delete=models.CASCADE, 
    primary_key=True,) 
    address = models.CharField(max_length=100) 
    date_of_birth = models.CharField(validators = [date_regex], max_length = 10, blank = True) 
    company = models.CharField(max_length=30) 
    home_phone = models.CharField(validators = [phone_regex], max_length = 10, blank = True) 
    work_phone = models.CharField(validators = [phone_regex], max_length = 10, blank = True) 

    def __str__(self): 
     return str(self.customer) 

views.pyの抜粋です:

def create_profile(request): 
if request.POST: 
    address = request.POST['address'] 
    date_of_birth = request.POST['date_of_birth'] 
    company = request.POST['company'] 
    home_phone = request.POST['home_phone'] 
    work_phone = request.POST['work_phone'] 

    custprofdata = CustomerDetail(address = address, date_of_birth = date_of_birth, company = company, home_phone = home_phone, work_phone = work_phone) 
    custprofdata.save() 

    output = {'address': address, 'dateofbirth': date_of_birth, 'company': company, 'homephone': home_phone, 'workphone': work_phone} 

    return render(request, 'newuser/profile_created.html', output) 
else: 
    return redirect(create_profile) 

そして、ここでは、スニペットですそれぞれの一部の形のものcreate_profile.html

<form action = "{% url 'create_profile' %}" class="create_profile" role="form" method = "post"> 
    {% csrf_token %} 
    <div class="form-group"> 
    <label for="address" class="col-md-3 control-label">Address</label> 
    <div class="col-md-9"> 
     <input type="text" class="form-control" name="address" placeholder="777 Park St" /> 
    </div> 
    </div> 
    <div class="form-group"> 
    <label for="date-of-birth" class="col-md-3 control-label">Date Of Birth</label> 
    <div class="col-md-9"> 
     <input type="text" class="form-control" name="date_of_birth" placeholder="09/12/82" /> 
    </div> 
    </div> 
    <div class="form-group"> 
    <label for="company" class="col-md-3 control-label">Company</label> 
    <div class="col-md-9"> 
     <input type="text" class="form-control" name="company" placeholder="Oracle"> 
    </div> 
    </div> 
    <div class="form-group"> 
    <label for="home-phone" class="col-md-3 control-label">Home Phone</label> 
    <div class="col-md-9"> 
     <input type="text" class="form-control" name="home_phone" placeholder="4082992788"> 
    </div> 
    </div> 
    <div class="form-group"> 
    <label for="work-phone" class="col-md-3 control-label">Work Phone</label> 
    <div class="col-md-9"> 
     <input type="text" class="form-control" name="work_phone" placeholder="6690039955"> 
    </div> 
    </div> 
    <div class="form-group"> 
    <div class="col-md-offset-3 col-md-9"> 
     <button type = "create" class="btn btn-success" form = "create_profile"> Submit </button> 
    </div> 
    </div>    
</form> 

答えて

1

基本のModelFormは、以下の問題だけで実装:

from django.forms import ModelForm 

from .models import CustomerDetail 

class CustomerDetailForm(ModelForm): 
    class Meta: 
     model = CustomerDetail 
     fields = ['address', 'date_of_birth', 'company', 'home_phone', 'work_phone',] 

https://docs.djangoproject.com/en/1.10/topics/forms/modelforms/#a-full-example

しかし、私はあなたにもクラスベースビュー(CBV)を使用するように切り替える示唆 - CREATEVIEWは同じことを行います暗黙的なModelForm(あなた自身のModelFormクラスを提供することによってカスタマイズすることができます)を使用して、既存のビューをより少ないコードで作成できます。

https://docs.djangoproject.com/en/1.10/ref/class-based-views/generic-editing/#createview

https://ccbv.co.uk/projects/Django/1.10/django.views.generic.edit/CreateView/

1

@ジョン・カーターは、私は `フォームを置く必要がありますが、データを保存するには、次の


def create_profile(request): 
    if request.POST: 
     form = CustomerDetailForm(request.POST) 
     if form.is_valid(): 
      ## save data in database ## 
      return render(request, 'newuser/profile_created.html', {form:form}) 
    else: 
     return redirect(create_profile) 
+0

にごview.pyを変更したい場合があります、言ったようにCustomerDetailFormを作成した後.save() '? –

+0

はい、フォームにはありません。古いview.pyと同じにする必要があります – krishh

関連する問題