2016-01-18 2 views
1

У меня есть система листинга на моем веб-сайте, и в настоящее время я создаю страницу, которая позволяет пользователю редактировать свою листинг. У меня есть большая часть ее работы, но я застрял на сохранении их обновленной формы. В настоящее время, если они сохраняют отредактированную форму, а не обновляют модель, она создает целую новую запись в списке и все еще оставляет старую. Если бы кто-нибудь мог посмотреть мой код, это было бы здорово, я так долго задерживался на этой проблеме!Редактировать форму объявления - это дублирование

View -

@login_required(redirect_field_name='login') 
def editlisting(request, pk): 

    post = JobListing.objects.get(pk=pk) 

    if str(request.user) != str(post.user): 
     return redirect("index") 

    if request.method == "POST": 
     print("test") 
     form = JobListingForm(request.POST, instance=post, force_update=True) 

     if form.is_valid(): 
      form.save() 
      return redirect('index') 

    else: 
     print("else") 
     form = JobListingForm(instance=post) 

    context = { 
     "form": form 
    } 

    return render(request, "editlisting.html", context) 

Модель -

class JobListing(models.Model): 

    region_choice = (
     ('Auckland', 'Auckland'), 
     ('Wellington', 'Wellington'), 
     ('Christchurch', 'Christchurch') 
    ) 
    industry_choice = (
     ('Accounting', 'Accounting'), 
     ('Agriculture, fishing & forestry', 'Agriculture, fishing & forestry'), 
     ('Automotive', 'Automotive'), 
     ('Banking, finance & insurance', 'Banking, finance & insurance'), 
     ('Construction & Architecture', 'Construction & Architecture'), 
     ('Customer service', 'Customer service'), 
    ) 
    employment_type_choice = (
     ('Full Time', 'Full Time'), 
     ('Part Time', 'Part Time'), 
     ('One-off', 'One-off'), 
     ('Other', 'Other') 
    ) 

    user = models.CharField(max_length=50) 
    job_title = models.CharField(max_length=30) 
    pay_rate = models.DecimalField(max_digits=10, decimal_places=2) 
    employment_type = models.CharField(max_length=10, choices=employment_type_choice) 
    job_description = models.CharField(max_length=2000) 
    business_address_region = models.CharField(max_length=50, choices=region_choice) 
    business_address_suburb = models.CharField(max_length=50) 
    business_industry = models.CharField(max_length=50, choices=industry_choice) 
    email = models.EmailField(max_length=50, blank=True, null="True") 
    telephone = models.IntegerField(blank=True, null='True') 
    active_listing = models.BooleanField(default=True) 

    class Meta: 
     verbose_name = 'Job Listing' 

    def clean(self): 
     if not (self.email or self.telephone): 
      raise ValidationError("You must specify either email or telephone") 
     if not self.email: 
      self.email = "Not Provided" 

    def __unicode__(self): 
     return "%s" % self.job_title 

Кусок кода из моей регистрации приложение, которое может быть, влияющих на нее?

def signup(self, request, user): 
    SignUpProfile.objects.create(
     user=user, 
     account_type=self.cleaned_data['account_type'], 
     contact_number=self.cleaned_data['contact_number'] 
    ) 

Форма -

class JobListingForm(forms.ModelForm): 

    class Meta: 
     model = JobListing 
     fields = ['job_title', 'pay_rate', 'employment_type', 'job_description', 'business_address_region', 
      'business_address_suburb', 'business_industry', 'telephone', 'email'] 
     widgets = { 
      'job_title': forms.TextInput(attrs={'class': 'form-input', 'placeholder': 'Job Title'}), 
      'pay_rate': forms.NumberInput(attrs={'class': 'form-input', 'placeholder': 'Hourly Rate or One Off Amount'}), 
      'employment_type': forms.Select(attrs={'class': 'form-input'}), 
      'job_description': forms.Textarea(attrs={'class': 'form-textarea', 
       'placeholder': 'Tell us additional information about your job listing e.g. Times, Business Info, Number of positions etc. (2000 Character Limit)'}), 
      'business_address_region': forms.Select(attrs={'class': 'form-input'}), 
      'business_address_suburb': forms.TextInput(attrs={'class': 'form-input', 'placeholder': 'Business Suburb'}), 
      'business_industry': forms.Select(attrs={'class': 'form-input'}), 
      'email': forms.EmailInput(attrs={'class': 'form-input', 'placeholder': 'Email'}), 
      'telephone': forms.NumberInput(attrs={'class': 'form-input', 'placeholder': 'Contact Numnber'}), 
     } 

Форма HTML -

<div id="createjoblisting"> 
    <h1 class="pageheader">Edit Your Job Listing</h1> 
    <form class="createjoblisting" id="createjoblisting_form" method="post" action="{% url 'createjoblisting' %}"> 
     {% csrf_token %} 
     {{ form.non_field_errors }} 
     <p> <label for="id_username" class="form-input-label">Job Title</label><br> 
     {{ form.job_title }}<br><p>{{ form.job_title.errors }} 
     <p><label for="id_username" class="form-input-label">Pay Rate</label><br> 
     {{ form.pay_rate }}<br></p>{{ form.pay_rate.errors }} 
     <p><label for="id_username" class="form-input-label">Employment Type</label><br> 
     {{ form.employment_type }}<br><p>{{ form.employment_type.errors }} 
     <p><label for="id_username" class="form-input-label">Job Description</label><br> 
     {{ form.job_description }}<br><p>{{ form.job_description.errors }} 
     <p><label for="id_username" class="form-input-label">Business Region</label><br> 
     {{ form.business_address_region }}<br><p>{{ form.business_address_region.errors }} 
     <p><label for="id_username" class="form-input-label">Business Suburb</label><br> 
     {{ form.business_address_suburb }}<br><p>{{ form.business_address_suburb.errors }} 
     <p><label for="id_username" class="form-input-label">Business Industry</label><br> 
     {{ form.business_industry }}<br><p>{{ form.business_industry.errors }} 
     <p><label for="id_username" class="form-input-label">Contact Number (Must provide either Contact Number or Email)</label><br> 
     {{ form.telephone }}<br><p>{{ form.telephone.errors }} 
     <p><label for="id_username" class="form-input-label">Email</label><br> 
     {{ form.email }}<br><p>{{ form.email.errors }} 
     <button type="submit" class="form-button">Update Job Listing</button> 
    </form> 
</div> 

URLS -

urlpatterns = [ 
    url(r'^createjoblisting/', views.createjoblisting, name='createjoblisting'), 
    url(r'^(?P<pk>[0-9]+)/editprofile/', views.editprofile, name='editprofile'), 
    url(r'^(?P<pk>[0-9]+)/editlisting/', views.editlisting, name='editlisting'), 
    url(r'^editlistingportal/', views.editlistingportal, name='editlistingportal'), 
] 
+1

Ваш код выглядит хорошо. Пожалуйста, разместите шаблон 'editlisting.html'. Может быть, атрибут 'action' формы установлен в представление создания, а не на редактирование? –

+2

Не связано, но вы не должны хранить пользователя как CharField. Используйте ForeignKey для пользователя, затем вы можете сравнить свое мнение, выполнив 'request.user == post.user'. –

+0

Эй, я добавил форму HTML. Я только что заметил, что я переработал много кода из «формы создания листинга», поэтому, возможно, проблема в этом? Дайте мне знать, что вы думаете –

ответ

1

вашей формы action неправильно. Измените его на:

<form action="{% url 'editlisting' %}" class="createjoblisting" id="createjoblisting_form" method="post" > 

Как вы скопировали шаблон создания, ваши формы сообщений данных в целях, который создает список вместо редактирования.

+0

Спасибо! Сделав эту модификацию, а затем изменив пару вещей в представлении, она отлично работала. –

Смежные вопросы